在主屏幕上设置谷歌搜索栏 自定义启动器编程

12

我正在创建“我的自定义启动器”。在这种情况下,我想将“快速搜索栏”放在我的主屏幕上,即Google Now启动器。

我该怎么办?我已经阅读了多个帖子,但没有找到相关的答案。

我不想显示“小部件选择器”。我希望用户一安装这个启动器就能看到搜索栏。

先感谢您的帮助。


@user1169390,你能帮我一下吗? - rupesh
你找到了解决这个问题的方法吗?我也遇到了同样的问题。 - Robi Kumar Tomar
2个回答

2

1
搜索栏未显示是因为启动器没有权限显示小部件。
如您可能已经发现的那样,如果用户明确将搜索栏小部件添加到任何屏幕上,系统会提示其授予权限,并且顶部的搜索栏也会出现。
问题在于Launcher类中的getOrCreateQsbBar方法(我假设您派生了Launcher3)如果无法实例化小部件,则不会请求权限,而是默默地失败。 问题出现在getOrCreateQsbBar内的此代码片段中:
    if (!AppWidgetManagerCompat.getInstance(this)
            .bindAppWidgetIdIfAllowed(widgetId, searchProvider, opts)) {
        mAppWidgetHost.deleteAppWidgetId(widgetId);
        widgetId = -1;
    }

不仅需要将widgetId重置为-1,还需要请求安装小部件的权限并再次调用getOrCreateQsbBar。以下是一个请求权限的示例代码:

    boolean hasPermission = appWidgetManager.bindAppWidgetIdIfAllowed(widgetId, searchProvider);
    if (!hasPermission)
    {
        mAppWidgetHost.deleteAppWidgetId(widgetId);
        widgetId = -1;

        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, searchProvider);
        startActivityForResult(intent, REQUEST_BIND);
    }

然后在Launcher类中重载onActivityResult方法,代码示例如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_BIND) {
        mSearchDropTargetBar.setQsbSearchBar(getOrCreateQsbBar());
    } 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接