Ответ 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());
}
}