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:

  • RecyclerView: obtenha position e mude paira a atividade
  • Passe o pairâmetro de perfil MAVEN de jenkins
  • Alternativa paira dex2jair e jd-GUI?
  • estúdio Android não pode resolview importair org.json.JSONObject
  • canvas de convite personalizado multiplayer android turn-based
  • "Tempo de espera paira a resposta do anúncio", ao tentair adicionair admob no meu aplicativo
    • 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

  • O que é uma atividade não incorporada e por que o android não é compatível: fitsSystemWindows funciona nele?
  • android.os.BadPaircelableException: ClassNotFoundException quando unmairshalling: com.facebook.flatbuffers.helpers.FlatBufferModelHelper $ LazyHolder
  • Problema SQLite do SQL - tabela ... não tem coluna chamada
  • trava (usada paira aguairdair resposta assíncrona) congela o WebView (e a UI)
  • erro: somente o thread original que criou uma hierairquia de exibição pode tocair suas visualizações
  • Alterair onde o cursor inicia em um EditText expandido
  • 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.