将 google 设置为主屏幕中的搜索栏 以编程方式自定义启动器

Set google as search bar in home screen Custom launcher programmatically

我正在主屏幕上创建“我自己的启动器. In that case I want to put快速搜索栏”,即 Google 现在启动器。

我该怎么做。我浏览了多个线程,但没有找到任何相关答案。

我不想显示 widget picker。我希望用户尽快安装此启动器搜索栏。

提前致谢。

我强烈建议您从 AOSP 克隆 Launcher3 存储库。

https://android.googlesource.com/platform/packages/apps/Launcher3/

如果您签出 nougat-mr5 分支,您可以查看通过从 GMS 包中获取组件并将其作为行元素包含在内来显示搜索栏的代码。请在代码中寻找QSB。

搜索栏未显示,因为启动器没有显示小部件的权限。

您可能已经知道,如果用户明确将搜索栏小部件添加到任何屏幕,系统将提示他授予权限,顶部的搜索栏也会出现。

问题是 Launcher class 中的 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 class 中重载 onActivityResult,类似于:

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