2

ウィジェットを LockScreen に埋め込もうとしています。このウィジェットは既に実装されており、「packages/apps」に配置されています。LockScreen コンストラクター ("framework/base/policy/src/com/android/internal/policy/impl/LockScreen.java) に、いくつかのコード行を追加しました。

    if (mCreationOrientation != Configuration.ORIENTATION_LANDSCAPE) {
       inflater.inflate(R.layout.keyguard_screen_tab_unlock_advanced, this, true);
       showWeatherClockWidget();
    } else {
       inflater.inflate(R.layout.keyguard_screen_tab_unlock_land, this, true);
    }

次のように showWeatherClockWidget() 関数を実装しました。

    private void showWeatherClockWidget() {
            mHost = new AppWidgetHost(mContext, HOST_ID);
            mAppWidgetManager = AppWidgetManager.getInstance(mContext);

            List<AppWidgetProviderInfo> providers = mAppWidgetManager.getInstalledProviders();
            for (AppWidgetProviderInfo pi: providers) {
                if (WEATHER_CLOCK_WIDGET.equals(pi.provider.getClassName())) {
                    int id = mHost.allocateAppWidgetId();
                    mPi = pi;
                    Log.v(TAG, "pi: " + pi.provider.getClassName());
                    Log.v(TAG, "id_length: " + mAppWidgetManager.getAppWidgetIds(pi.provider).length);
                    mAppWidgetManager.bindAppWidgetId(id, pi.provider);
                    addAppWidgetView(id, pi);
                }
            }
        }

   private void addAppWidgetView(int appWidgetId, AppWidgetProviderInfo appWidget) {
        // Inflate the AppWidget's RemoteViews
        mAppWidgetContainer = (LinearLayout) findViewById(R.id.weatherclock_widget_container);
        AppWidgetHostView view = mHost.createView(mContext, appWidgetId, appWidget);
        view.setAppWidget(appWidgetId, appWidget);

        // Add it to the list
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        mAppWidgetContainer.addView(view, layoutParams);
    }

ウィジェットを含む LinearLayout は、「framework/base/core/res/res/layout」に配置された独自の xml レイアウト ファイルで定義されました。

    <LinearLayout
        android:id="@+id/weatherclock_widget_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
     />

その後、一連の問題に直面しました。まず、次のようなエラーが表示されました。

E/AndroidRuntime( 2614): java.lang.SecurityException: bindAppWidgetId appWidgetId=25 provider=ComponentInfo{com.sample.weatherclock/com.sample.weatherclock.ClockWidgetDigital}: User 1000 does not have android.permission.BIND_APPWIDGET.

BIND_APPWIDGET には protectionLevel = "signature|system" があると思います。システム優先で実行されるため、LockScreen にこの権限がないのはなぜでしょうか。この権限を AndroidManifest.xml ("frameworks/base/core/res") に追加しようとしましたが、うまくいきませんでした。そのため、「/base/services/java/com/android/server/AppWidgetServiceImpl.java」でパーミッションをチェックするために使用されるいくつかのコード行を無効にすることで、いくつかのトリックを行いました。

public void bindAppWidgetId(int appWidgetId, ComponentName provider) {
//    mContext.enforceCallingPermission(android.Manifest.permission.BIND_APPWIDGET,
//        "bindAppWidgetId appWidgetId=" + appWidgetId + " provider=" + provider);
    bindAppWidgetIdImpl(appWidgetId, provider);
 }

その後、ウィジェットをバインドできましたが、別の問題に直面していました。ウィジェットを更新できませんでした。ロック画面が初めてオンになったときにのみ更新されます。onUpdate() にログを入れたところ、時間が変わるたびに呼び出されることがわかりました。

I/WeatherClock(  326): updateTime: 9:2
I/WeatherClock(  326): updateDate: 10/8 |4
I/WeatherClock(  326): ClockWidgetDigital onUpdate()

その上、私はそれと対話することさえできません。私がそれに触れたとき、私はログを受け取りました:

I/ActivityManager(  147): START {act=android.intent.action.MAIN flg=0x10000000 cmp=com.sample.weatherclock/.WeatherSettingsActivity bnds=[10,50][471,317] u=0} from pid -1

しかし、何も起こりません。このアクティビティは開始できません。

誰でも私を助けることができますか?私はこれで何日も立ち往生していました:(事前に感謝します。

更新 ウィジェットに触れたときにウィジェットがアクティビティを開始できないということは実際にはありません。実際、画面のロックを解除した後、すでに実行されています。それ自体のロックを解除することはできません。それを解決するためのアイデアはありますか?

4

0 に答える 0