我正在. In that case I want to put
我的主屏幕(即 Google now 启动器)中创建“我自己的启动器快速搜索栏”。
我怎样才能做到这一点。我经历了多个线程,但没有找到任何相关的答案。
我不想显示widget picker
。我希望尽快用户安装这个启动器搜索栏应该在那里。
提前致谢。
我正在. In that case I want to put
我的主屏幕(即 Google now 启动器)中创建“我自己的启动器快速搜索栏”。
我怎样才能做到这一点。我经历了多个线程,但没有找到任何相关的答案。
我不想显示widget picker
。我希望尽快用户安装这个启动器搜索栏应该在那里。
提前致谢。
我真的建议您从 AOSP 克隆 Launcher3 存储库。
https://android.googlesource.com/platform/packages/apps/Launcher3/
如果您签出 nougat-mr5 分支,您可以查看代码以显示搜索栏,方法是从 GMS 包中获取组件并将其作为行元素包含在内。请在代码中查找 QSB。
搜索栏未显示,因为启动器无权显示小部件。
正如您可能已经发现的那样,如果用户明确地将搜索栏小部件添加到任何屏幕,则会提示他授予权限,并且顶部的搜索栏也会出现。
问题是类中的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());
}
}