Имам приложение за Android, което прави това:
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();
}
Тествах това на 4 различни телефона и много различни конфигурации на емулатор. Всички те работят добре. Но получавам доклади за сривове от внедрени приложения в дивата природа, хвърлящи NPE, тъй като resolveInfo понякога е нула.
Незабавното решение е да хвана NPE и да се справя с него, преди да срине приложението ми (както е направено по-горе). Но се опитвах с дни да възпроизведа това сам и не успях. На емулатор с инсталиран единствен браузър по подразбиране, той се разрешава на com.android.browser.BrowserActivity:
ResolveInfo{411ef228 com.android.browser.BrowserActivity p=0 o=0 m=0x208000}
По същия начин, на телефон с инсталирани множество браузъри, това се разрешава малко по-различно...до com.android.internal.app.ResolverActivity:
ResolveInfo{415c13b8 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0}
Документите resolveActivity() тук посочете:
Връща ResolveInfo, съдържащ окончателното намерение за дейност, което е определено като най-доброто действие. Връща нула, ако не е намерена съответстваща дейност. Ако бъдат открити множество съвпадащи дейности и няма набор по подразбиране, връща ResolveInfo, съдържащ нещо друго, като например преобразувателя на дейността.
Така че разгледах първия сценарий, този на намерение за дейност, определено като най-доброто действие. Също последният сценарий, този на множество съвпадащи дейности без действие по подразбиране, връщащ ResolverActivity.
Наистина бих искал да възпроизведа сценария на resolveActivity(), който ми дава нула при искане на активността на URL. Някой има ли идеи как може да стане това без, да речем, рутване на устройството?