如何从链接打开应用程序而不要求用户在浏览器或应用程序之间做出决定,只需立即打开我的应用程序

时间:2015-12-18 16:18:33

标签: android android-intent android-activity android-manifest intentfilter

每次用户点击指向eeexample.com的链接打开我的应用时,我都会想要这个intent-filter

<intent-filter>
    <data android:scheme="http" />
    <data android:scheme="http" android:host="eeexample.com"/>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

当用户点击gmail应用上的eeexample.com时,例如: enter image description here

然后打开一个对话框,询问用户是否希望从我的应用浏览器打开此链接,如下所示:

enter image description here

但我只是希望当用户点击链接时,它会打开我的应用而不会询问任何内容。或者在最糟糕的情况下,只需要用我的应用程序打开它,这是Appetit而不是浏览器。这可能吗?

更新

所以看来这可能与App Links有关,但仅适用于API级别23(Android 6.0),但我需要这个api级别15(Android 4.0),任何想法?

8 个答案:

答案 0 :(得分:6)

只有使用适用于App Linking的Android 6.0 API才能绕过消除歧义对话框。

根据Handling App Links training

  

Android 6.0(API级别23)及更高版本允许应用将自己指定为给定类型链接的默认处理程序。如果用户不希望该应用成为默认处理程序,则他们可以从设置覆盖此行为。

     

自动处理链接需要应用开发者和网站所有者的合作。开发人员必须配置其应用程序以声明与一个或多个网站的关联,并请求系统验证这些关联。反过来,网站所有者必须通过发布数字资产链接文件来提供该验证。

这包括创建相应的intent handler并通过添加android:autoVerify="true"

启用自动验证
<activity ...>

  <intent-filter android:autoVerify="true">
    <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="www.android.com" />
    <data android:scheme="https" android:host="www.android.com" />
  </intent-filter>

</activity>

然后,必须通过declaring a website association在网站上进行更新,以确保网站所有者和应用开发者都协调以允许应用自动成为URL方案的默认设置。

答案 1 :(得分:2)

您可以在以下两个地方验证.well-known/assetlinks.json的可访问性,这是删除歧义消除对话框的重要前提。

https://developers.google.com/digital-asset-links/tools/generator

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://YOUR_WEBSITE&relation=delegate_permission/common.handle_all_urls

就我而言,尽管进行了所有检查,但消除歧义对话框还是不会消失。原来,我还使用了FirebaseUI Auth for GitHub(https://github.com/firebase/FirebaseUI-Android/tree/master/auth),后者使用firebase_web_host;如果定义的内容不是android:host中定义的值,那么android:autoVerify也会失败。

问题是,firebase_web_host埋在了我的代码之外的某个地方,所以android:autoVerify失败的原因并不清楚。一种简单的查找方法是在安装应用程序时检查adb log。您应该会看到类似

IntentFilterIntentSvc: Verification .. complete. Success:true. Failed hosts:.

如果您看到Success:false,它应该显示哪些主机发生故障,以便为您提供寻找位置的线索。

答案 2 :(得分:0)

您所做的所有操作都是正确的,只需用另一个单词更改https和http  写“ app” 例 数据android:scheme =“ app” android:host =“ com” android:pathPrefix =“ / easy”

http或https表示运行浏览器会导致冲突

答案 3 :(得分:0)

在您的AndroidManife.xml中 放

<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="myAPP" />
</intent-filter>

例如

 <activity
        android:name="Activity"
        android:exported="true"
        android:windowSoftInputMode="adjustPan">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <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="myAPP" />
        </intent-filter>
 </activity>

之后 当单击使用方案“ myAPP”的任何网址时 您的应用程序将打开 没有用户请求

例如URL

myAPP://yoursite.com

myAPP://any.site.com

答案 4 :(得分:0)

我已经搜索了很多准确的答案,但令人非常沮丧的是,即使在 Android 的文档中,我们也无法得到一个好的和直接的答案。我尝试了很多,用于打开应用程序的 URL 的不同结构,最后,在清单中放置内容的文档部分是正确的,您只需要设置一个意图,主机和 一个方案,如下所示:

<activity ...>

  <intent-filter>
            <data android:scheme="schemeName" android:host="hostName" android:path="/"/>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
        </intent-filter>

</activity>

schemeNamehostName 中的任何地方都可以是你想要的任何东西,重要的部分不在文档中,是如何在链接中成功调用应用程序,所以对于为此,您必须创建一个遵循此结构的链接:

intent://hostName/#Intent;scheme=schemeName;package=your.app.package;end

your.app.package 中的应用程序包的位置。请记住,您可以从清单中获取您的应用程序包。我真的希望能帮助很多人,我搜索了很多但最重要的是测试了很多以获得正确的 URL 结构来打开应用程序。

答案 5 :(得分:-1)

在Android中,您无法在没有用户确认的情况下强制从特定应用打开链接。

用户在下次点击“始终”时,您的应用将会打开

答案 6 :(得分:-1)

所以这是一种方法,但就我的经验而言,我并非完全100%确定它始终有效: 因为如果其他一些应用程序也使用相同的设置优先级的机制,那么它可能会显示在Android OS建议的应用程序列表中

当您声明一个意图过滤器来响应事件时,您也可以将优先级设置为

<intent-filter android:icon="drawable resource"
   android:label="string resource"
   android:priority="integer" >
 // some other properties
 </intent-filter>

优先级提供有关活动如何响应与筛选器匹配的意图的信息,相对于也可以响应意图的其他活动。当一个意图可以由具有不同优先级的多个活动来处理时。

请注意, Android会仅考虑优先级值较高的人作为意图的潜在目标。

那么优先级的价值应该是多少? 该值必须是整数,例如&#34; 100&#34;。数字越大,优先级越高。默认值为0.该值必须大于-1000且小于1000。

-1000是SYSTEM_LOW_PRIORITY,1000是SYSTEM_HIGH_PRIORITY

这里有一些Android文档链接可能会帮助你了解更多 -

intent-filter

more about setting priority

希望这有帮助!一切顺利

更新请注意,无论您做什么,第一次都必须完成用户选择打开应用的步骤

答案 7 :(得分:-1)

添加标记Intent.FLAG_ACTIVITY_NEW_TASK肯定会有所帮助:

Uri location = Uri.parse(deeplink);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
mapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);