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


107

ブラウザーで開くのではなく、ユーザーが特定のパターンのURLをクリックしたときにリンクを開くようアプリに促すことができるようにしたいと思います。これは、ユーザーがブラウザーまたは電子メールクライアントのWebページ上にある場合、または新しく作成されたアプリのWebView内にある場合です。

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

自分のアプリでこれをどのように達成しますか?


stackoverflow.com/questions/5065982/…も参照してください。
CoolMind

回答:


141

カテゴリ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>

内部に入ったら、アクティビティに移動し、アクションを探して、渡されたURLで何かを行う必要があります。Intent.getData()この方法は、あなたのウリを与えます。

    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)ため、これを実現するためのより良い方法があることに気付くかもしれません。


8
知っておくべきことの1つ-ユーザーがアプリをハンドラーとして登録するだけなので、適切なアプリを使用するかどうかの選択肢がユーザーに表示されます。個人的には(ユーザーとして)「デフォルトのアクション」を選択できることに気づいていますが、私はそれに悩まされています
Bostone

1
これはHTC Phoneでは機能しません。HTCフォンで動作させるにはどうすればよいですか?
user484691 2012

57
クエリ文字列を含む完全なURLが必要な場合は、getData()ではなくintent.getDataString()を使用することをお勧めします。このコメントはそれだけで私にかかる時間を節約します..... :-(
Kenton Price

これは、ユーザーが任意のアプリまたはネイティブブラウザーから移動するすべてのURLに対して呼び出されますか?
ゴンゾブレイン2013

1
(Intent.ACTION_VIEWインテントを使用する)任意のアプリから
jamesh


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;
    }

}

4
ありがとう。これは、Webビューを所有しているコンテキストで役立ちます。私が尋ねていた質問は、どのようにしてアプリがどのアプリ(例:ブラウザー)内のリンクのクリックをインターセプトするかです。
jamesh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.