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

jam*_*esh 105 android url-interception intentfilter android-intent

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

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

我如何为自己的应用程序实现此目的?

jam*_*esh 140

使用类别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>
Run Code Online (Sandbox Code Playgroud)

进入活动后,您需要查找操作,然后使用您已经提交的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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

然而,应该注意的是,这个应用程序有点过时(1.2),所以你可能会发现有更好的方法来实现这一点.

  • 如果您关心包括查询字符串的完整URL,您可能希望使用intent.getDataString()而不是getData().这个评论将节省你只花费我的时间..... :-( (57认同)
  • 有一点需要注意 - 您的用户将被选择使用合适的应用程序,因为您所做的只是将您的应用程序注册为处理程序.就个人而言(作为用户)虽然我意识到我可以选择"默认行动",但我对此感到恼火 (8认同)
  • 来自任何应用程序(使用 Intent.ACTION_VIEW 意图) (2认同)