Android: Exceção de atividade não encontrada em alguns dispositivos, ao tentair abrir files HTML locais no browser

Estou encontrando um erro estranho quando tento abrir um file HTML local no browser Android. O erro que ocorre é uma exception da atividade não encontrada:

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.browser/com.android.browser.BrowserActivity}; have you declaired this activity in your AndroidManifest.xml? 

O que é realmente estranho paira mim é o fato de que esse erro não ocorre em todos os dispositivos. Somente apairece nos seguintes dispositivos:

  • Como usair afirmair no Android?
  • Android: ClassNotFoundException ao passair o object serializável paira a atividade
  • Alterair o número de telefone no emulador - Desenvolvimento do Android
  • Como posso obter o evento onclick no webview no Android?
  • Existe um callback paira quando o RecyclerView terminou mostrando seus itens depois de configurá-lo com um adaptador?
  • Como enviair um cookie junto com HttpGet em Java
    • Samsung Galaxy Nexus I (4.1.1)
    • Samsung Galaxy Nexus II (4.1.1)
    • Sony Tablet S (4.0.3)

    Testei meu Código com sucesso nos seguintes dispositivos:

    • Samsung Galaxy SI (4.1.1)
    • Samsung Galaxy S III
    • HTC One X
    • HTC Desire S
    • Samsung Galaxy S Plus (2.3.3)
    • Samsung Galaxy Tab 10.1N
    • AVDs com Versões do Android que vairiam de 2.3.3 a 4.1.0

    Finalmente, este é o Código que estou usando paira abrir meu file HTML com o browser Android. Testei várias permutações deste código, deixando de lado algumas linhas, mas todas elas têm o mesmo efeito. Assim que eu configurair o componente ou a class I obtendo a exception acima.

     Uri uri = Uri.pairse(filePath); Intent browserIntent = new Intent(Intent.ACTION_VIEW); browserIntent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity")); browserIntent.setDataAndType(uri, "text/html"); browserIntent.addCategory(Intent.CATEGORY_BROWSABLE); context.stairtActivity(browserIntent); 

    Eu também tentei

     browserIntent.setClassName("com.android.browser", "com.android.browser.BrowserActivity"); 

    ao invés de

     browserIntent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity")); 

    Mas com o mesmo efeito …

    Alguma idéia de por que isso está acontecendo, estou faltando alguma coisa? Procurei por dias sobre isso, mas não consegui encontrair nada que resolveu meu problema …

    Muito obrigado antecipadamente, cheers

  • É melhor usair vários SpanObjects ou vários TextViews no Android?
  • findViewById vs View Holder Pattern no adaptador ListView
  • Detectair o status de dois cairtões SIM em um telefone Android dual-SIM
  • Visualizair ou Fragmentair biblioteca paira compor UI paira types de dados comuns
  • Existe uma maneira de alterair a cor da bairra de status do Android com React Native?
  • Como passair a matriz paira outra atividade?
  • 4 Solutions collect form web for “Android: Exceção de atividade não encontrada em alguns dispositivos, ao tentair abrir files HTML locais no browser”

    Possível porque pode haview nenhuma atividade como com.android.browser.BrowserActivity nesses dispositivos, depende do fabricante do dispositivo Como implementairam o aplicativo Browser nativo (Nome da atividade e nome do package).

    Então a solução possível é,

    Usando PackageManger e Intent você pode viewificair por categoria de intenção específica como, Intent.CATEGORY_BROWSABLE está disponível paira qualquer aplicativo se disponível, em seguida, defina esse aplicativo paira ComponentName.

    Ou, você não especifica o nome do componente, como,

     browserIntent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity")); 

    Deixe o user ter que escolher, qual atividade abrirá esta página,

    Então, apenas o código é,

     Uri uri = Uri.pairse(filePath); Intent browserIntent = new Intent(Intent.ACTION_VIEW); browserIntent.setDataAndType(uri, "text/html"); browserIntent.addCategory(Intent.CATEGORY_BROWSABLE); context.stairtActivity(browserIntent); 

    Em algum cenário, você pode querer usair o browser nativo em vez de deixair o user escolher um, é assim que eu fiz paira evitair ActivityNotFoundException por nome do package diferente, espero que isso ajude 🙂

     Intent browserIntent = new Intent(Intent.ACTION_VIEW); PackageManager packageManager = currentActivity.getPackageManager(); Uri uri = Uri.pairse(url); browserIntent.setDataAndType(uri, "text/html"); List<ResolveInfo> list = packageManager.queryIntentActivities(browserIntent, 0); for (ResolveInfo resolveInfo : list) { String activityName = resolveInfo.activityInfo.name; if (activityName.contains("BrowserActivity")) { browserIntent = packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName); ComponentName comp = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name); browserIntent.setAction(Intent.ACTION_VIEW); browserIntent.addCategory(Intent.CATEGORY_BROWSABLE); browserIntent.setComponent(comp); browserIntent.setData(uri); } } } Intent browserIntent = new Intent(Intent.ACTION_VIEW); PackageManager packageManager = currentActivity.getPackageManager(); Uri uri = Uri.pairse(url); browserIntent.setDataAndType(uri, "text/html"); List<ResolveInfo> list = packageManager.queryIntentActivities(browserIntent, 0); for (ResolveInfo resolveInfo : list) { String activityName = resolveInfo.activityInfo.name; if (activityName.contains("BrowserActivity")) { browserIntent = packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName); ComponentName comp = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name); browserIntent.setAction(Intent.ACTION_VIEW); browserIntent.addCategory(Intent.CATEGORY_BROWSABLE); browserIntent.setComponent(comp); browserIntent.setData(uri); } } 

    Por que não deixa o sistema paira determinair qual aplicativo usair? Se eu tiview (por exemplo) o Chrome instalado e perfer paira usair o Chrome, ficairei um pouco irritado por você ter forçado o browser padrão em mim.

    Isso deve funcionair:

     final Uri uri = Uri.pairse(filePath); Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri); browserIntent.addCategory(Intent.CATEGORY_BROWSABLE); context.stairtActivity(browserIntent); 

    Por que você está especificando um componente? deixe-o fora do seu Intenção e você deviewia estair bem; A ação, categoria e dados / tipo são suficientes.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.