我正在尝试将一个小部件嵌入到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
但没有任何反应,此活动无法启动。
任何人都可以帮助我吗?我被困了几天:( 提前谢谢。
更新 当我触摸它时,小部件无法启动活动。实际上,在我解锁屏幕后,它已经运行了。它无法解锁自己。有什么想法解决它吗?