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

rup*_*esh 12 android launcher android-qsb android-launcher

我正在. In that case I want to put我的主屏幕上创建"我自己的启动器快速搜索栏",即谷歌现在发射器.

我怎样才能做到这一点.我已经通过多个线程但没有找到任何相关的答案.

我不想显示widget picker.我希望asap用户安装此启动器搜索栏应该在那里.

提前致谢.

Ish*_*ael 1

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

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

问题是类getOrCreateQsbBar中的方法Launcher(我假设您分叉了 Launcher3)如果无法实例化小部件,则不会请求权限,而是默默地失败。问题出在以下代码片段中getOrCreateQsbBar

    if (!AppWidgetManagerCompat.getInstance(this)
            .bindAppWidgetIdIfAllowed(widgetId, searchProvider, opts)) {
        mAppWidgetHost.deleteAppWidgetId(widgetId);
        widgetId = -1;
    }
Run Code Online (Sandbox Code Playgroud)

您不只是重置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);
    }
Run Code Online (Sandbox Code Playgroud)

然后onActivityResultLauncher类中重载,大致如下:

    if (!AppWidgetManagerCompat.getInstance(this)
            .bindAppWidgetIdIfAllowed(widgetId, searchProvider, opts)) {
        mAppWidgetHost.deleteAppWidgetId(widgetId);
        widgetId = -1;
    }
Run Code Online (Sandbox Code Playgroud)