从浏览器拦截链接以打开我的 Android 应用程序

Posted

技术标签:

【中文标题】从浏览器拦截链接以打开我的 Android 应用程序【英文标题】:Intercepting links from the browser to open my Android app 【发布时间】:2010-12-09 05:40:30 【问题描述】:

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

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

如何为我自己的应用实现这一点?

【问题讨论】:

另见***.com/questions/5065982/…。 【参考方案1】:

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

【讨论】:

需要注意的一件事 - 您的用户将可以选择使用合适的应用程序,因为您所做的只是将您的应用程序注册为处理程序。我个人(作为用户)对此感到恼火,尽管我意识到我可以选择“默认操作” 这不适用于 HTC 手机。如何让它在 HTC 手机上运行? 如果您关心包括查询字符串在内的完整 URL,您可能希望使用 intent.getDataString() 而不是 getData()。此评论将为您节省我花费的时间..... :-( 是否会为用户从任何应用程序或本地浏览器导航到的每个 URL 调用此函数? 来自任何应用(使用 Intent.ACTION_VIEW 意图)【参考方案2】:

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

比如

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

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

例子

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);

【讨论】:

【参考方案3】:
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;
    


【讨论】:

谢谢。这在您拥有 web 视图的上下文中很有用。我问的问题是如何让我的应用拦截对任何应用(例如浏览器)中链接的点击。

以上是关于从浏览器拦截链接以打开我的 Android 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 chromebook/chrome 操作系统上注册 Android 应用程序的协议处理程序以打开外部链接?

Android 深层链接 - 不显示意图选择器弹出窗口,强制打开应用

使用意图不打开应用程序的 Android 深层链接

从网站打开 Android 应用程序不起作用

从其他应用程序加载外部Web链接到我的浏览器

从其他应用程序加载外部网络链接到我的浏览器