ユーザーがブラウザーに開かせるのではなく、与えられたパターンのURLをクリックしたときにリンクを開くようにアプリに要求できるようにしたいと思います。これは、ユーザーがブラウザーまたは電子メールクライアントのWebページにアクセスしているとき、または新しく作成されたアプリのWebViewにアクセスしているときです。
たとえば、携帯電話のどこからでもYouTubeリンクをクリックすると、YouTubeアプリを開く機会が与えられます。
自分のアプリでこれを達成するにはどうすればよいですか?
カテゴリ Android.intent.category.BROWSABLE のAndroid.intent.action.VIEWを使用します。
Romain Guyの Photostream アプリの AndroidManifest.xml から、
_ <activity
Android:name=".PhotostreamActivity"
Android:label="@string/application_name">
<!-- ... -->
<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="http"
Android:Host="flickr.com"
Android:pathPrefix="/photos/" />
<data Android:scheme="http"
Android:Host="www.flickr.com"
Android:pathPrefix="/photos/" />
</intent-filter>
</activity>
_
内部に入ったら activity に移動し、アクションを探し、渡されたURLで何かをする必要があります。 Intent.getData()
メソッドはUriを提供します。
_ final Intent intent = getIntent();
final String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action)) {
final List<String> segments = intent.getData().getPathSegments();
if (segments.size() > 1) {
mUsername = segments.get(1);
}
}
_
ただし、このアプリは少し古くなっている(1.2)ため、これを達成するためのより良い方法があることに気付くはずです。
Urlからパラメータを自動的に解析するライブラリがいくつかあります。
といった
https://github.com/airbnb/DeepLinkDispatch
&&
https://github.com/mzule/ActivityRouter
後者は私が書いたものです。常に文字列ではなく、指定された型のパラメーターを解析できます。
例
@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
setUrlparams(url);
if (url.indexOf("pattern") != -1) {
// do something
return false;
} else {
view.loadUrl(url);
}
return true;
}
}