標準ブラウザと Chrome の行き来がしたい
理由
Chrome を使うようになった理由
- ソフトウェアアップデートが原因で標準ブラウザがクラッシュするようになった
- Chromecast を使うようになった
標準ブラウザに戻りたい理由
- Chrome のダウンローダは途中で失敗する率が高い
- ブックマーク・保存したページの利用
- Adobe Flash が必要なページがある(無理やり使える)
方法
- 共有からインテントを使う
問題点
- インテントの種類
- ブラウザの判別方法
- 他のアプリからの動作
- URL の抽出
インテントの種類
共有から出ているのは Intent.ACTION_SEND
で、
ブラウザを開くのが Intent.ACTION_VIEW
なので、
Inten を新規作成するのが一番手っ取り早い.
ブラウザの判別
Intent の flags を使う
一番手っ取り早い方法です.
自分の端末では以下の値が格納されていました.
int 標準ブラウザ = 5033164;
int Chrome = 50855937;
Intent intent = mActivity.getIntent();
String action = intent.getAction();
if (Intent.ACTION_SEND.equals(action)) {
int flags = intent.getFlags();
// ...
// TODO: Intent.EXTRA_TEXT から URL を取得
// TODO: Intent.EXTRA_SUBJECT から URL を取得
// ...
Intent newIntent = new Intent(Intent.ACTION_VIEW, uri);
switch(flags) {
case 5033164: // 標準ブラウザだったら Chrome で開く
newIntent.setPackage("com.android.chrome");
mActivity.finish();
break;
case 50855937: // Chrome だったら標準ブラウザで開く
newIntent.setPackage("com.android.browser");
mActivity.finish();
break;
}
mActivity.startActivity(newIntent);
}
mActivity.finish()
をすると戻るボタンで元のブラウザに戻れるようになったりするよ.
共有からURLを抽出
共有からURLを取得するためには判別するしかない.
private static final String HTTP_URL_PATTERN =
"(http://|https://){1}[\\w\\.\\-/:\\#\\?\\=\\&\\;\\%\\~\\+]+";
private String getUrl(String text) {
if (text == null) {
return null;
}
Pattern urlPattern =
Pattern.compile(HTTP_URL_PATTERN, Pattern.CASE_INSENSITIVE);
Matcher matcher = urlPattern.matcher(text);
if (matcher.find()) {
return matcher.group();
}
return null;
}
これさえわかればあとは煮るなり焼くなり好きにできる.
他のアプリからの動作
setPackage
を行わず単純に URL を開く
結論
標準ブラウザの保存ページのエクスポートと Chrome のダウンローダが正常に動作すればこんなことしなくて済むのでサムスンと Google はなんとかしてください.
最新のソフトウェアアップデートを適用させると 最新バージョの Youtube が再生できない不具合があるので、アプリで検索してブラウザで再生することもできるので "共有" からブラウザで開く機能は非常に便利です.
作った
Github - tanjo/http-intenter
キャッシュを保存しているのは後々履歴表示やらなんやらしたり.
インテントのカスタマイズもできるようにしたいなぁという願望の元保存されている.
いらないなら消せばいい.