Установите Google в качестве строки поиска на главном экране. Пользовательский пусковой механизм программно

Я создаю свою собственную панель запуска . In that case I want to put Панель быстрого поиска на моем домашнем экране, то есть Google теперь запускает.

Как я могу это сделать. Я прошел несколько потоков, но не нашел ответа.

Я не хочу показывать widget picker. Я хочу, чтобы пользователь asap установил эту панель поиска пусковой установки.

Спасибо заранее.

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

Ответ 2

Я действительно рекомендую вам клонировать репозиторий Launcher3 из AOSP.

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

Если вы выберете ветку nougat-mr5, вы можете посмотреть код, чтобы показать строку поиска, взяв компонент из пакета GMS и включив его в качестве элемента строки. Пожалуйста, найдите QSB ​​в коде.