我在使用自定义启动器的主屏幕上添加小部件时遇到了一些问题。
我已经能够使用AppWidgetManager生成要添加的小部件列表,并且我已经开发了将小部件添加到主屏幕的工作流程。代码不是下面的内容,但看起来如下所示:
AppWidgetHost widget_host = new AppWidgetHost(this, 1);
AppWidgetManager widget_manager = AppWidgetManager.getInstance(this);
int widget_id = widget_host.allocateAppWidgetId();
AppWidgetProviderInfo widget_provider = ... //from an array;
Intent bindIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
bindIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widget_id);
bindIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget_provider.provider);
startActivityForResult(bindIntent, REQUEST_BIND_APPWIDGET);
if (widget_provider.configure != null) {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
intent.setComponent(widget_provider.configure);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widget_id);
startActivityForResult(intent, REQUEST_CREATE_APPWIDGET);
} else {
createWidget(widget_id);
}
然后我有一个onActivityResult方法,如果需要,可以导致小部件的配置,createWidget方法使用AppWidgetHost的createView方法。
此工作流程有效,但ACTION_APPWIDGET_BIND意图要求用户绑定应用程序的权限,这有点烦人。我的理解是,只有系统应用程序可以请求此权限,并且我在运行应用程序时不会在未请求此权限的情况下绑定小部件。另一方面,我知道还有很多其他的发射器,他们都可以无缝地添加小部件,所以必须有另一种方法。
非常感谢任何建议!
干杯
答案 0 :(得分:3)
希望问题仍然存在......
你在方法中做了太多事情。在特定情况下,你会一个接一个地发动事件。我在android上的工作时间不长,所以我不能告诉你,这是否可以。
你总是在这里解雇意图:
Intent bindIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
bindIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widget_id);
bindIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget_provider.provider);
startActivityForResult(bindIntent, REQUEST_BIND_APPWIDGET);
上述意图最可能导致问题。您可以事先检查,是否需要请求许可。你可以问这个例程:
Boolean callProviderIntent = false;
if (checkCallProviderIntent)
{
callProviderIntent = true;
Method m = null;
try
{
m = AppWidgetManager.class
.getMethod("bindAppWidgetIdIfAllowed", new Class[]
{ Integer.TYPE, ComponentName.class });
}
catch (NoSuchMethodException e)
{
}
if (m != null)
{
try
{
callProviderIntent = !(Boolean) m
.invoke(mAppWidgetManager,
appWidgetId,
launcherAppWidgetInfo.provider);
}
catch (Exception e)
{
}
}
}
是虚拟代码。它使用反射,因为我在Android 2.3下。
答案 1 :(得分:2)
这是我最终为我的申请找到的解决方案。
AppWidgetManager manager = m.getAppWidgetManager();
AppWidgetHost host = m.getWidgetHost();
List<AppWidgetProviderInfo> widgetList = manager.getInstalledProviders();
AppWidgetProviderInfo provider = null;
for(AppWidgetProviderInfo info : widgetList){
//To get the google search box
if(info.provider.getClassName().equals("com.google.android.googlequicksearchbox.SearchWidgetProvider")){
provider = info;
break;
}
}
if(provider != null){
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.hostView = hostView;
info.hostView.setAppWidget(id, appWidgetInfo);
attachWidget(info);
} else {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER,
provider.provider);
// TODO: we need to make sure that this accounts for the options
// bundle.
// intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS,
// options);
m.startActivityForResult(intent, Main.REQUEST_BIND_APPWIDGET);
}
}
}