13

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

我怎样才能做到这一点。我经历了多个线程,但没有找到任何相关的答案。

我不想显示widget picker。我希望尽快用户安装这个启动器搜索栏应该在那里。

提前致谢。

4

2 回答 2

2

我真的建议您从 AOSP 克隆 Launcher3 存储库。

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

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

于 2017-03-04T14:44:36.913 回答
1

搜索栏未显示,因为启动器无权显示小部件。

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

问题是类中的getOrCreateQsbBar方法Launcher(我假设你分叉了 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);
    }

onActivityResult然后在类中重载Launcher,类似于:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_BIND) {
        mSearchDropTargetBar.setQsbSearchBar(getOrCreateQsbBar());
    } 
}
于 2017-03-11T03:00:35.823 回答