每次用户点击指向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时,例如:
然后打开一个对话框,询问用户是否希望从我的应用或浏览器打开此链接,如下所示:
但我只是希望当用户点击链接时,它会打开仅我的应用而不会询问任何内容。或者在最糟糕的情况下,只需要用我的应用程序打开它,这是Appetit而不是浏览器。这可能吗?
所以看来这可能与App Links有关,但仅适用于API级别23(Android 6.0),但我需要这个api级别15(Android 4.0),任何想法?
答案 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
就我而言,尽管进行了所有检查,但消除歧义对话框还是不会消失。原来,我还使用了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
答案 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>
schemeName 和 hostName 中的任何地方都可以是你想要的任何东西,重要的部分不在文档中,是如何在链接中成功调用应用程序,所以对于为此,您必须创建一个遵循此结构的链接:
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文档链接可能会帮助你了解更多 -
希望这有帮助!一切顺利
更新请注意,无论您做什么,第一次都必须完成用户选择打开应用的步骤
答案 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);