将 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());
}
}
我正在主屏幕上创建“我自己的启动器. 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());
}
}