Как запустить браузер для открытия локального файла

Я пытаюсь отправить намерение браузеру открыть локальный файл. Я хочу использовать браузер по умолчанию, чтобы открыть этот файл.

if(file.exists()){ Log.d(TAG, "file.exists"); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file)); context.startActivity(intent); } 

Но это меня бросает и освобождает

 08-10 13:27:58.993: ERROR/AndroidRuntime(28453): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///sdcard/release_notes.htm } 

Если я использую следующий браузер, браузер google.com, как и ожидалось

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://google.com")); 

Также, когда я пишу файл url (file:///sdcard/release_notes.htm) в адресную строку браузера, он открывает его, как ожидалось.

Вам нужно добавить категорию просмотра в намерение.

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file)); intent.addCategory(Intent.CATEGORY_BROWSABLE); startActivity(intent); 

Браузер запускается только для HTML и других совместимых файлов. Это должно работать:

 Intent intent = new Intent(ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "text/html"); 

Это то, что работает для меня. Я взял тип mime непосредственно из Manifest.xml браузера по умолчанию Android. По-видимому, mime text / html предназначен только для http (s) и встроенных схем.

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_BROWSABLE); intent.setDataAndType(Uri.fromFile(filePath), "application/x-webarchive-xml"); startActivity(intent); 

Не уверен, что он работает в каждой комбинации Android и телефона / браузера, но это единственный способ заставить его работать.

Изменить: Протестировано с помощью хрома и не работает. Также не работает с моим устройством 2.3.3. Кажется, работает с браузером по умолчанию в Android 4.0.

Вот приблизительный более надежный подход:

 private void openInBrowser(File file) { final Uri uri = Uri.fromFile(file); try { final Intent browserIntent = new Intent(Intent.ACTION_VIEW); browserIntent.setClassName("com.android.browser", "com.android.browser.BrowserActivity"); browserIntent.setData(uri); startActivity(browserIntent); } catch (ActivityNotFoundException e) { final Intent browserIntent = new Intent(Intent.ACTION_VIEW); browserIntent.setDataAndType(Uri.fromFile(file), "text/html"); startActivity(browserIntent); } } 

Я тестировал это на Nexus One (API 16, 4.1.2), где работает try , и Nexus 5 (API 22, 5.1.1), где работает только catch .

Возможно, это работает:

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "text/html"); startActivity(intent); 

Проблема в том, что новая активность не имеет доступа к странице html внутри вашего приложения, так как это другое приложение, и у нее нет никаких прав на это.

Этот код работает как с API 10, так и с API 11.

 File f = new File("/mnt/sdcard/index.html"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_BROWSABLE); intent.setDataAndType(Uri.fromFile(f), "application/x-webarchive-xml"); // Have to add this one in order to work on Target 2.3.3 (API 10) intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity"); startActivity(intent); 
Intereting Posts
Как изменить цвет текста индикатора вкладок в android? Любые текстовые редакторы с открытым исходным кодом для Android? Android Exception: вы забыли вызвать «public void setup (LocalActivityManager activityGroup)», Android – Facebook ShareDialog исчезает через несколько секунд после того, как он показывает Почему eglMakeCurrent () не работает с EGL_BAD_MATCH? Как получить сообщение об ошибке ПОСТОЯННОГО приложения в строке состояния? Андроид AlarmManager не пробуждает телефон вверх Использование Rest для хранения данных в Sqlite Android Recyclerview Layoutmanager's onLayoutChildren вызывается при изменении содержимого элемента Eclipse Android Emulator-5554 всегда отображается Отправка push на несколько устройств Android с одним POST Сохранение дочерних коллекций с OrmLite на Android с объектами, созданными из Jackson EditText В всплывающем окне Как использовать Recyclerview внутри Scrollview Панель инструментов Android + ActionBarDrawerToggle не меняется на стрелку