androidアプリを作る際にWebViewを組み込んでアプリ内ブラウザで表示することとかよくあると思います。
そんな時にWebページの中にhoge://hugahuga
みたいなURIが出てきた場合は、大体shouldOverrideUrlLoading
内に
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Uri uri = Uri.parse(url); String scheme = uri.getScheme(); if (scheme.indexOf("http") != 0) { Uri intent_uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, intent_uri); activity.startActivity(intent); return true; } return super.shouldOverrideUrlLoading(view, url); }
こんなかんじの(他にもjavascript://とかありますけど割愛)処理を書いていると思います。 要は自前でハンドリングしてないSchemeはIntentとして飛ばすよ、的な処理ですがこれでちょっとこまったことに
何に困ったかって「アプリがインストールされてればschemeで起動、なければマーケットに飛ばすリンク」の場合、コレだとおかしくなるんですね。
<a href="intent://sample#Intent;scheme=foo;package=jp.example.foo;end">OPEN</a>
↑こんなやつ
どう困るかってUri.parse(url)
こいつは#とか余計なものを弾いてしまうので、正しくIntentが送られない。どうすっぺかってんで調べてみたらIntent.getIntent(url)
を使うと良いらしいのですが、こいつ結構前から非推奨になってる。
なのでIntent.parseUri(url, flag)
を使うのが良さそう。
でも最近android全然触れてないので動作検証すらしてない。 これ正しいのかなぁ。 おわり。