2017-02-20 14 views
12

Tworzę "mój własny launcher . In that case I want to put Pasek szybkiego wyszukiwania" na moim ekranie głównym, np. Google Launcher.Ustaw google jako pasek wyszukiwania na ekranie głównym Niestandardowo program uruchamiający programowo

Jak mogę to zrobić. Przeszedłem przez wiele wątków, ale nie znalazłem żadnej odpowiedniej odpowiedzi.

Nie chcę pokazywać widget picker. Chcę, aby jak najszybciej zainstalować użytkownika pasek wyszukiwania uruchamiania powinien tam być.

Z góry dziękuję.

+0

@ user1169390 można proszę mi pomóc w tej sprawie? – rup35h

+0

znalazłeś jakieś obejście tego problemu? Jestem na tej samej stronie. –

Odpowiedz

1

Pasek wyszukiwania nie jest wyświetlany, ponieważ program uruchamiający nie ma uprawnień do wyświetlania widżetu.

Jak już zapewne wiesz, jeśli użytkownik jawnie doda widżet paska wyszukiwania do dowolnego ekranu, zostanie poproszony o udzielenie pozwolenia, a także pojawi się pasek wyszukiwania u góry.

Problem polega na tym, że metoda getOrCreateQsbBar w klasie Launcher (zakładam, że rozwidliłaś Launchera3) nie prosi o uprawnienia, jeśli nie może utworzyć instancji widgetu, zamiast tego po cichu zawiedzie. Problem polega na tym fragmencie wewnątrz getOrCreateQsbBar:

if (!AppWidgetManagerCompat.getInstance(this) 
      .bindAppWidgetIdIfAllowed(widgetId, searchProvider, opts)) { 
     mAppWidgetHost.deleteAppWidgetId(widgetId); 
     widgetId = -1; 
    } 

Zamiast resetowania widgetId do -1 chcesz zapytać o uprawnienia do zainstalowania widget i nazywają getOrCreateQsbBar ponownie. Oto przykładowy kod, który prosi o pozwolenie:

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); 
    } 

Następnie przeciążać onActivityResult w klasie Launcher, coś wzdłuż linii:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == REQUEST_BIND) { 
     mSearchDropTargetBar.setQsbSearchBar(getOrCreateQsbBar()); 
    } 
} 
Powiązane problemy