Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: Activity not found exception on some devices, when trying to open local HTML - file in browser

I'm encountering a strange error when I try to open a local HTML - file in the android browser. The error that occurs is an activity not found exception:

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

What's really strange to me ist the fact that this error does not occur on all devices. It only comes up on the following devices:

  • Samsung Galaxy Nexus I (4.1.1)
  • Samsung Galaxy Nexus II (4.1.1)
  • Sony Tablet S (4.0.3)

I have tested my Code successfully on the following devices:

  • Samsung Galaxy S I (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 with Android Versions ranging from 2.3.3 to 4.1.0

Finally this is the Code I'm using to open my HTML - file with the Android - browser. I have tested several permutations of this code, leaving out some lines, but they do all have the same effect. As soon as I set component or class I getting the above exception.

Uri uri = Uri.parse(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.startActivity(browserIntent);

I have also tried

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

instead of

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

But with the same effect...

Has someone an idea why this is happening, am I missing something? I have searched for days on this but couldn't find anything that solved my problem...

Thanks a lot in advance, cheers

like image 561
Henning Avatar asked Aug 01 '12 08:08

Henning


3 Answers

Possible because may be there is no any activity like com.android.browser.BrowserActivity in those devices, Its depends on device manufacturer How they implement the native Browser Application (Activity Name and Package name).

So the possible solution is,

Using PackageManger and Intent you can check for specific intent category like, Intent.CATEGORY_BROWSABLE is available for any application if available then set that application to ComponentName.

Or, You don't specify component name, like,

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

let user have to choose, which Activity will open this page,

So just code is,

Uri uri = Uri.parse(filePath);
Intent browserIntent = new Intent(Intent.ACTION_VIEW);
browserIntent.setDataAndType(uri, "text/html");
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
context.startActivity(browserIntent);
like image 136
user370305 Avatar answered Oct 12 '22 14:10

user370305


in some scenario you might want to use the native browser instead of letting user chose one, this is how I did to avoid ActivityNotFoundException by different package name, hope this would help :)

Intent browserIntent = new Intent(Intent.ACTION_VIEW);
PackageManager packageManager = currentActivity.getPackageManager();
Uri uri = Uri.parse(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);
    }
}
like image 25
Mia Avatar answered Oct 12 '22 15:10

Mia


Why not leave it to the system to determine which app to use? If I have (for example) Chrome installed and perfer to use Chrome, I'll be a bit pissed that you forced the default browser on me.

This should work:

final Uri uri = Uri.parse(filePath);
Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri);
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
context.startActivity(browserIntent);
like image 31
copolii Avatar answered Oct 12 '22 15:10

copolii