読者です 読者をやめる 読者になる 読者になる

サムスン GALAXY S III α SC-03E docomo の標準ブラウザと Chrome 間を行き来がしたい

標準ブラウザと 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

キャッシュを保存しているのは後々履歴表示やらなんやらしたり. インテントのカスタマイズもできるようにしたいなぁという願望の元保存されている. いらないなら消せばいい.

Qiita に書いた記事