AppWidgetManager.ACTION_APPWIDGET_BIND 总是 returns Activity.RESULT_CANCELED
AppWidgetManager.ACTION_APPWIDGET_BIND always returns Activity.RESULT_CANCELED
我正在构建自定义启动器。我已经按照步骤
Android 文档中提到了托管 App Widgets 以及浏览
默认启动器源代码。但是,当我使用 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 OS 显示的选择器中选择意图,则无需绑定,因为框架会自动绑定小部件。
如果您实现了自定义选择器(例如,在许多自定义启动器中实现的显示小部件预览图像的东西),则绑定是必要的。
我正在构建自定义启动器。我已经按照步骤 Android 文档中提到了托管 App Widgets 以及浏览 默认启动器源代码。但是,当我使用 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 OS 显示的选择器中选择意图,则无需绑定,因为框架会自动绑定小部件。
如果您实现了自定义选择器(例如,在许多自定义启动器中实现的显示小部件预览图像的东西),则绑定是必要的。