无法与嵌入锁屏的Widget交互

时间:2012-11-08 02:12:51

标签: android frameworks android-widget lockscreen

我正在尝试将一个小部件嵌入到LockScreen中。此小部件已经实现,并已放入“软件包/应用程序”。 在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的小部件是在我自己的xml布局文件中定义的,该文件放在“framework / base / core / res / res / layout”中

    <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

但没有任何反应,此活动无法启动。

任何人都可以帮助我吗?我被困了几天:( 提前谢谢。

更新 当我触摸它时,小部件无法启动活动。实际上,在我解锁屏幕后,它已经运行了。它无法解锁自己。有什么想法解决它吗?

0 个答案:

没有答案