我正在构建一个自定义启动器。我已经按照步骤
Android文档中提到的用于托管应用小部件以及浏览的文档
默认的启动器源代码。但是,当我使用意图动作作为AppWidgetManager.ACTION_APPWIDGET_BIND调用startActivityForResult时,即使用户正在接受UI上显示的对话框提示,它也始终返回Activity.RESULT_CANCELED。
这是代码片段
appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetHost = new AppWidgetHost(this, 7772);
int appWidgetId = appWidgetHost.allocateAppWidgetId();
Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
startActivityForResult(pickIntent, REQUEST_PICK);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, " onActivityResult " + requestCode + " res " + resultCode);
if (requestCode == REQUEST_PICK && resultCode == Activity.RESULT_OK)
{
int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
AppWidgetProviderInfo info = appWidgetManager.getAppWidgetInfo(appWidgetId);
boolean hasPermission = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, info.provider);
if (!hasPermission)
{
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.provider);
startActivityForResult(intent, REQUEST_BIND);
}
}else if (requestCode == REQUEST_BIND) {
// Here the resultCode is always returning Activity.RESULT_CANCELED
}
}
有人可以帮我解决我可能做错的事情吗?
我还添加了android:name =“ android.permission.BIND_APPWIDGET”
在清单文件中。
最后,通过Android日志,我可以看到类似
1567-1940/system_process E/AppWidgetServiceImpl: Widget id 34 already bound to: ProviderId{user:0, app:10025, cmp:ComponentInfo{com.android.deskclock/com.android.alarmclock.AnalogAppWidgetProvider}}
最佳答案
找到了问题。如果有人遇到相同的问题,请在此处回答。
如果您使用AppWidgetManager.ACTION_APPWIDGET_PICK意图从Android操作系统显示的选择器中选择意图,则无需进行绑定,因为框架会自动绑定窗口小部件。
如果实现自定义选择器(例如,显示可在许多自定义启动器中实现的窗口小部件的预览图像的东西),则必须进行绑定。