2016-02-27 10 views
0

Ну, я ломал ад моих мозговых клеток с этим и не решением придумал ...Открыть браузер с Схемой URI данных вместо URL

Обычно в Android, чтобы открыть веб-браузер в указанный сайт, мы делаем это:

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

Итак, я получил схему URI данных (Незнайка, если он написан таким образом, я не специалист по такого рода вещи), как это:

data:text/html;charset=utf8;base64,<base64 html code> 

Если я копирую и вставляю это в веб-браузер, он будет обрабатывать его так, как я этого хочу.

Но как я могу сделать это программно в Android?

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(dataHTMLBase64)); 
startActivity(browserIntent); 

dataHTMLBase64 хранит схему URI данных, о которой я упоминал ранее.

Неправильный код не работает. Он даже не запускает хром.

Что я могу сделать?

PS: Я плохо разбираюсь в английском. Пожалуйста, предупредите меня, если я не выразить себя правильный путь ...

+0

Я был бы удивлен, если бы браузеры в целом поддерживали эту схему 'Uri' для входящих« намерений », так или иначе. Они будут обрабатывать его внутренне, когда они столкнутся с такими URL-адресами с веб-страниц, которые они загружают. – CommonsWare

ответ

0

Если вы получите эти идентификаторы URI данных где-то вы могли бы сделать две вещи:

  1. PARSE содержание данных из него и использовать его в некотором WebView и позвоните loadData(...) на нем, чтобы отобразить содержимое
  2. Сохраните содержимое данных URI в каком-либо файле, используйте FileProvider, чтобы сделать этот файл доступным вне вашего приложения и использовать URI, возвращенный этим, чтобы запустить браузер/вид намерения
1

На самом деле, похоже, что вы легко можете запустить URI данных в Android-браузере.

String url = "data:text/html;charset=utf8,<b>Hee-haw!</b>"; 

startActivity(Intent.makeMainSelectorActivity(
     Intent.ACTION_MAIN, Intent.CATEGORY_APP_BROWSER) 
     .setData(Uri.parse(url.toString()))); 

Использование apktool я рассмотрел AndroidManifest.xml из .apk файла Google Chrome.
(apktool довольно легко установить, а затем команда просто apktool d example.apk)

Я нашел соответствующие умысел фильтры (перечислены ниже), поэтому существует множество возможных способов запуска браузера. Конечно, у других браузеров могут быть разные фильтры намерений, но кажется, что APP_BROWSER - хороший выбор.

<activity-alias android:exported="true" android:name="com.google.android.apps.chrome.Main" android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <category android:name="android.intent.category.LAUNCHER"/> 
     <category android:name="android.intent.category.BROWSABLE"/> 
     <category android:name="android.intent.category.APP_BROWSER"/> 
     <category android:name="android.intent.category.NOTIFICATION_PREFERENCES"/> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <category android:name="android.intent.category.BROWSABLE"/> 
     <data android:scheme="googlechrome"/> 
     <data android:scheme="http"/> 
     <data android:scheme="https"/> 
     <data android:scheme="about"/> 
     <data android:scheme="javascript"/> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <category android:name="android.intent.category.BROWSABLE"/> 
     <data android:scheme="googlechrome"/> 
     <data android:scheme="http"/> 
     <data android:scheme="https"/> 
     <data android:scheme="about"/> 
     <data android:scheme="content"/> 
     <data android:scheme="javascript"/> 
     <data android:mimeType="text/html"/> 
     <data android:mimeType="text/plain"/> 
     <data android:mimeType="application/xhtml+xml"/> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <data android:mimeType="multipart/related" android:scheme="file"/> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.MEDIA_SEARCH"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.speech.action.VOICE_SEARCH_RESULTS"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <data android:scheme="http"/> 
     <data android:scheme="https"/> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH"/> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="com.sec.android.airview.HOVER"/> 
    </intent-filter> 
    <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> 
</activity-alias>