2012-12-21 14 views
5

Mam aplikację na Androida, które wykonuje to:Rozwiązywanie przeznaczona do adresu URL jest czasami null, rzuca NullPointerException

PackageManager pm = getApplicationContext().getPackageManager(); 
    Intent browserIntent = new Intent(); 
    browserIntent.setAction(Intent.ACTION_VIEW); 
    browserIntent.addCategory(Intent.CATEGORY_BROWSABLE); 
    browserIntent.setData(Uri.parse("http://www.google.com")); 

    ResolveInfo resolveInfo = pm.resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY); 
    try { 
     String browserType = nutent.activityInfo.packageName; 
    } catch (NullPointerException npe) { 
     npe.printStackTrace(); 
    } 

ja testowałem to na 4 różnych telefonów i wiele różnych konfiguracji emulatora. Wszystkie działają dobrze. Ale otrzymuję raporty o awariach z wdrożonych aplikacji w dziale wyrzucając NPE, ponieważ resolveInfo czasami jest zerowe.

Natychmiastową poprawką jest złapanie NPE i uporanie się z nim przed awarią mojej aplikacji (jak to zrobiono powyżej). Ale od wielu dni próbowałem to powtórzyć i nie mogę. Na emulatorze z jednym domyślnej przeglądarce zainstalowany, postanawia com.android.browser.BrowserActivity:

ResolveInfo{411ef228 com.android.browser.BrowserActivity p=0 o=0 m=0x208000} 

Podobnie na słuchawki z wieloma przeglądarkami zainstalowanymi ta postanawia nieco inaczej ... do com.android. internal.app.ResolverActivity:

ResolveInfo{415c13b8 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0} 

resolveActivity() Dokumenty here stan:

Zwraca ResolveInfo zawierający końcowej aktywności celu, by był determ być najlepszym działaniem. Zwraca wartość null, jeśli nie znaleziono pasującej czynności. Jeśli znaleziono wiele zgodnych działań i nie ma ustawień domyślnych, zwraca ResolveInfo zawierające coś innego, na przykład resolver działania.

Tak więc omówiłem pierwszy scenariusz działania zamierzonego jako najlepsze działanie. Również ostatni scenariusz wielokrotnych dopasowań działań bez domyślnej akcji, zwracający wartość ResolverActivity.

Naprawdę chciałbym odtworzyć scenariusz resolveActivity(), podając mi wartość zerową, gdy zażądam aktywności adresu URL. Czy ktoś ma jakieś pomysły na to, jak można to zrobić bez, powiedzmy, zrootowania urządzenia?

+0

Na marginesie, "zjedzenie" wyjątku, tak jak ty, to zła praktyka. Wyjątki są generowane z ważnych powodów, a podczas uzyskiwania dostępu do zewnętrznego zasobu istnieje wiele powodów, dla których może się to nie udać, a Twój kod powinien sobie z nimi poradzić. – Simon

+0

To jest właściwie tylko "fikcyjna" intencja, która służy tylko do pobrania typu i wersji przeglądarki (jeśli są dostępne), nigdy nie jest używana do pobierania jakichkolwiek stron internetowych ani do robienia czegokolwiek innego. Uważam, że w tym przypadku wystarczające jest zjadanie wyjątku i ustawienie typu i wersji mojej przeglądarki na "nieznany". Nie ma nic innego, co chciałbym zrobić z wyjątkiem. – AWT

+2

Dobre pytanie. Nie wiem na pewno, ale domyślam się, że być może nie opisałeś ostatniego scenariusza "działania z wieloma dopasowaniami bez domyślnej akcji", nawet jeśli myślisz, że masz, ponieważ określasz MATCH_DEFAULT_ONLY. Nie złamałem źródła pakietu PackageManager (dobry następny krok), ale zastanawiam się, co robi, jeśli powiesz mu, żeby pasował do domyślnego, a nie ma domyślnego, zwróć null?Czy przetestowałeś urządzenie lub emulator z wieloma przeglądarkami i ustawiłeś BEZ DEFAULT? (Upewnij się, że wybieracz pojawi się, jeśli klikniesz na link itp.). –

Odpowiedz

0

Naprawdę chciałbym odtworzyć scenariusz resolveActivity() , podając mi wartość zerową, gdy zażądam aktywności adresu URL. Czy ktokolwiek ma jakieś pomysły, jak można to zrobić bez, powiedzmy, zrootowania urządzenia?

  1. przejdź do Ustawienia> Aplikacje> Wszystkie> Zlokalizuj przeglądarkę (y) (na Nexusie 4 z Zdjęcie ROM Byłoby Chrome)> Wyłącz
  2. zaczęły równać NPEs :)
Powiązane problemy