拦截来自浏览器的链接以打开我的Android应用


107

我希望能够在用户单击给定格式的URL时提示我的应用程序打开链接,而不是允许浏览器打开它。当用户在浏览器中的网页上,电子邮件客户端中或刚开发的应用程序中的WebView中时,可能就是这种情况。

例如,从手机中的任意位置单击YouTube链接,您将有机会打开YouTube应用。

如何为自己的应用程序实现这一目标?


Answers:


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()方法给您一个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),因此您可能会发现实现此目的的更好方法。


8
需要注意的一件事-您将获得使用适当应用程序的选择权,因为您要做的就是将您的应用程序注册为处理程序。我个人(作为用户)对此感到恼火,尽管我意识到我可以选择“默认动作”
波士顿,

1
这不适用于HTC电话。如何在HTC手机上使用它?
user484691 2012年

57
如果您关心包含查询字符串的完整URL,则可能要使用intent.getDataString()而不是getData()。此评论将节省您仅花费我一个小时的时间.....::-(
Kenton Price

是否会为用户从任何应用程序或仅本机浏览器导航到的每个URL调用此函数?
gonzobrains

1
从任何使用Intent.ACTION_VIEW Intent的应用中
-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 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.