web-dev-qa-db-ja.com

ブラウザからのリンクをインターセプトしてmy Android app

ユーザーがブラウザーに開かせるのではなく、与えられたパターンのURLをクリックしたときにリンクを開くようにアプリに要求できるようにしたいと思います。これは、ユーザーがブラウザーまたは電子メールクライアントのWebページにアクセスしているとき、または新しく作成されたアプリのWebViewにアクセスしているときです。

たとえば、携帯電話のどこからでもYouTubeリンクをクリックすると、YouTubeアプリを開く機会が与えられます。

自分のアプリでこれを達成するにはどうすればよいですか?

104
jamesh

カテゴリ 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)ため、これを達成するためのより良い方法があることに気付くはずです。

140
jamesh

Urlからパラメータを自動的に解析するライブラリがいくつかあります。

といった

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

後者は私が書いたものです。常に文字列ではなく、指定された型のパラメーターを解析できます。

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);
2
Cao Dongping
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;
    }

}
0
Dacx