109

当用户单击给定模式的 URL 而不是允许浏览器打开它时,我希望能够提示我的应用程序打开一个链接。这可能是当用户在浏览器中的网页上或在电子邮件客户端中或在新创建的应用程序中的 WebView 中时。

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

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

4

3 回答 3

143

使用类别 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),所以你可能会发现有更好的方法来实现这一点。

于 2009-10-22T20:09:37.587 回答
2

有一些库会自动从 url 解析参数。

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

后一篇是我写的。它可以将参数解析为给定类型,而不总是字符串。

例子

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);
于 2016-04-09T06:12:10.557 回答
1
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;
    }

}
于 2010-01-15T20:24:53.827 回答