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

时间:2017-02-20 08:46:53

标签: android launcher android-launcher android-qsb

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

我该怎么做?我经历了多个线程但没有找到任何相关的答案。

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

我真的建议你从AOSP克隆Launcher3资源库。

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

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

答案 1 :(得分:1)

由于启动器无权显示小部件,因此不会显示搜索栏。

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

问题是Launcher类中的getOrCreateQsbBar方法(我假设您分叉了Launcher3)如果无法实例化小部件,则不会要求权限,而是静默失败。问题出在 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()); } } ,类似于:

import re
links = soup.findAll('img', {'src': re.compile('^http://image\d+')})
for link in links:
    if re.search('photo\/pictures\.jpg', link.get('href', ''), re.IGNORECASE):
        link_i_want = link.get('href')
        break