我创建了一个测试 Android 启动器应用程序,并将其作为系统应用程序安装在已 root 的设备上。该应用程序的目标是将所有已安装的小部件放置在 View 页面的 fragment 上。这已经成功完成;但是,每次显示新页面时都会向用户显示一条消息。
即使用户选中该框,每次添加小部件时仍会显示该消息。
我通常遵循 Hosting widgets in an android launcher 中的步骤和 Adding widgets to a launcher page without bindAppWidgetId()将小部件添加到应用程序。
首先,我在扩展应用程序的类中获取小部件列表,并将其存储在公共(public)静态变量中
AppWidgetManager manager = AppWidgetManager.getInstance(this);
widgetList = manager.getInstalledProviders();
接下来我使用绑定(bind) Intent 来获取小部件
appWidgetManager = AppWidgetManager.getInstance(this.getActivity());
appWidgetHost = new AppWidgetHost(this.getActivity(), APPWIDGET_HOST_ID);
int id = appWidgetHost.allocateAppWidgetId();
Intent bindIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
bindIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
bindIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER,LauncherExperiment.widgetList.get(mParam1).provider);
startActivityForResult(bindIntent, REQUEST_BIND_APPWIDGET);
然后根据 Activity 结果我创建小部件
Bundle extras = data.getExtras();
int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appWidgetId);
AppWidgetHostView hostView = appWidgetHost.createView(this.getActivity(), appWidgetId, appWidgetInfo);
hostView.setAppWidget(appWidgetId, appWidgetInfo);
// Add it on the layout you want
myLayout.addView(hostView);
我再次对设备进行了 root 操作,并通过更新 list 将该应用程序安装为系统应用程序
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.launcherexperiment"
android:sharedUserId="android.uid.system" >
并按照此处的步骤操作: How can I sign my application with the system signature key?
综上所述,我已经能够成功绑定(bind)应用程序并显示它们;但问题是警告消息最多只能显示一次。
最佳答案
我们开始吧!使用此代码,用户只会看到该对话框一次。 它还展示了以编程方式添加小部件的完整解决方案。
由于我将在我的 github 上更新此内容,请在此处查找最新版本,https://github.com/DagW/FragmentHomescreen/blob/master/app/src/main/java/se/dw/fragmenthomescreen/widget/WidgetFragment.java .
但出于存档目的,我现在这样做。
/**
* checkToAddWidget
* <p/>
* At the creation of WidgetFragment,
* add a default widget so that the homescreen is not empty
* shows how to add widgets programmatically
*/
private void checkToAddWidget () {
MainActivity m = (MainActivity) getActivity();
AppWidgetManager manager = m.getAppWidgetManager();
AppWidgetHost host = m.getAppWidgetHost();
List<AppWidgetProviderInfo> widgetList = manager.getInstalledProviders();
AppWidgetProviderInfo searchProvider = null;
AppWidgetProviderInfo search2Provider = null;
AppWidgetProviderInfo clockProvider = null;
for ( AppWidgetProviderInfo info : widgetList ) {
Log.d(TAG, info.provider.getPackageName() + " " + info.provider.getClassName());
if ( info.provider.getClassName().equals("com.google.android.googlequicksearchbox.SearchWidgetProvider") ) {
searchProvider = info;
break;
}
if ( info.provider.getClassName().equals("com.android.alarmclock.AnalogAppWidgetProvider") ) {
clockProvider = info;
}
if ( info.provider.getClassName().equals("com.android.alarmclock.DigitalAppWidgetProvider") ) {
clockProvider = info;
}
if ( info.provider.getClassName().equals("com.android.quicksearchbox.SearchWidgetProvider") ) {
search2Provider = info;
}
}
if ( searchProvider != null || search2Provider != null || clockProvider != null ) {
AppWidgetProviderInfo provider = null;
if ( searchProvider != null ) {
provider = searchProvider;
} else if ( clockProvider != null ) {
provider = clockProvider;
} else {
provider = search2Provider;
}
addProvider(m, host, manager, provider);
}
}
public void addProvider (MainActivity m, AppWidgetHost host, AppWidgetManager manager, AppWidgetProviderInfo provider) {
int id = host.allocateAppWidgetId();
boolean success = false;
success = manager.bindAppWidgetIdIfAllowed(id, provider.provider);
if ( success ) {
AppWidgetHostView hostView = host.createView(getActivity(), id, provider);
AppWidgetProviderInfo appWidgetInfo = manager.getAppWidgetInfo(id);
LauncherAppWidgetInfo info = new LauncherAppWidgetInfo(id);
info.setHostView(hostView);
info.getHostView().setAppWidget(id, appWidgetInfo);
ItemInfo launcherInfo = attachWidget(info);
if ( launcherInfo != null ) {
WidgetPersistance.addDesktopAppWidget(screen, launcherInfo);
}
} else {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, provider.provider);
m.startActivityForResult(intent, MainActivity.REQUEST_BIND_APPWIDGET);
}
}
您可能还需要
<uses-permission android:name="android.permission.BIND_APPWIDGET"
tools:ignore="ProtectedPermissions"/>
关于java - Android 以编程方式向应用程序添加小部件警告消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26847824/