AppWidgetManager.ACTION_APPWIDGET_BIND始终返回Activity.RESULT_CANCELED

时间:2016-10-15 06:50:58

标签: android android-widget android-launcher

我正在构建一个自定义启动器。我遵循了这些步骤 在Android文档中提到托管App Widgets以及浏览 默认的Launcher源代码。但是当我使用intent操作作为AppWidgetManager.ACTION_APPWIDGET_BIND调用startActivityForResult时,它总是返回Activity.RESULT_CANCELED,即使用户正在接受UI上显示的对话框提示。

这是代码段

    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}}

2 个答案:

答案 0 :(得分:4)

发现问题。如果其他人面临同样的问题,请在此处回答。

如果您使用AppWidgetManager.ACTION_APPWIDGET_PICK来从Android操作系统显示的选择器中选择意图,则无需绑定,因为框架会自动绑定窗口小部件。

如果您实现自定义选择器(例如,显示在许多自定义启动器中实现的窗口小部件的预览图像的内容),则必须进行绑定。

答案 1 :(得分:-1)

您可以检查活动的启动模式是否定义为singleInstance吗?如果将其删除,则不会出现此问题。

我在另一个相关问题中找到了这个答案: startActivityForResult(...) immediately returns 0