Answers:
<intent-filter>
与<data>
元素一起使用。例如,要处理所有指向twitter.com的链接,请将其放在您的<activity>
中AndroidManifest.xml
:
<intent-filter>
<data android:scheme="http" android:host="twitter.com"/>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
然后,当用户在浏览器中单击指向Twitter的链接时,系统将询问他们使用哪个应用程序来完成操作:浏览器还是您的应用程序。
当然,如果要在网站和应用程序之间提供紧密的集成,则可以定义自己的方案:
<intent-filter>
<data android:scheme="my.special.scheme" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
然后,在您的网络应用中,您可以放置如下链接:
<a href="my.special.scheme://other/parameters/here">
当用户单击它时,您的应用程序将自动启动(因为它可能是唯一可以处理my.special.scheme://
uris类型的应用程序)。唯一的缺点是,如果用户未安装该应用程序,则将收到一个讨厌的错误消息。而且我不确定是否有任何检查方法。
编辑:要回答您的问题,您可以使用getIntent().getData()
返回一个Uri
对象。然后,您可以使用Uri.*
方法来提取所需的数据。例如,假设用户点击了以下链接http://twitter.com/status/1234
:
Uri data = getIntent().getData();
String scheme = data.getScheme(); // "http"
String host = data.getHost(); // "twitter.com"
List<String> params = data.getPathSegments();
String first = params.get(0); // "status"
String second = params.get(1); // "1234"
您可以在自己的任何位置进行上述操作Activity
,但您可能会想要在其中进行onCreate()
。您还可以使用params.size()
获取中的路径段数Uri
。请查看javadoc或android开发人员网站,Uri
以获取可用于提取特定部分的其他方法。
CHROME
截至2014年1月28日,以上所有答案均不适用于我
我的应用程序可以通过http://example.com/someresource/从环聊,gmail等应用程序中的链接正常启动,但不能从chrome浏览器中启动。
为了解决这个问题,以便它可以从CHROME正常启动,您必须像这样设置意图过滤器
<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:host="example.com"
android:pathPrefix="/someresource/"
android:scheme="http" />
<data
android:host="www.example.com"
android:pathPrefix="/someresource/"
android:scheme="http" />
</intent-filter>
注意pathPrefix
元素
每当用户通过单击google搜索结果或任何其他网站的链接从chrome浏览器请求http://example.com/someresource/模式时,您的应用现在就会显示在活动选择器中
请在此处查看我的评论:在Android浏览器中建立链接以启动我的应用程序?
我们强烈建议人们不要使用自己的方案,除非他们正在定义新的全球互联网方案。
就我而言,我必须为设置两个类别<intent-filter>
,然后它才起作用:
<intent-filter>
<data android:scheme="my.special.scheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
例如,您有接下来的事情:
打开您的应用的链接:http : //example.com
您应用的程序包名称:com.example.mypackage
然后,您需要执行以下操作:
1)在活动中添加一个意图过滤器(可以是您想要的任何活动。有关更多信息,请参见文档)。
<activity
android:name=".MainActivity">
<intent-filter android:label="@string/filter_title_view_app_from_web">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "http://example.com" -->
<data
android:host="example.com"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2)创建一个HTML文件来测试链接或使用此方法。
<a href="intent://example.com#Intent;scheme=http;package=com.example.mypackage;end">Open your Activity directly (just open your Activity, without a choosing dialog). </a>
<a href="http://example.com">Open this link with browser or your programm (by choosing dialog).</a>
3)使用Mobile Chrome进行测试
4)就这样。
并且不必在市场上发布应用程序来测试深层链接=)
还应该将其<category android:name="android.intent.category.BROWSABLE"/>
添加到意图过滤器,以使活动可以正确地从链接中识别出来。
以下链接提供了有关直接从浏览器启动应用程序(如果已安装)的信息。否则,它将直接在Play商店中打开该应用程序,以便用户可以无缝下载。
请注意,实现此功能时,如果您的图标从android启动器中消失了,则必须拆分intent-filter。
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<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="your-own-uri" />
</intent-filter>
</activity>
是的,Chrome搜索而不是寻找方案。如果您想通过URI方案启动您的应用,请在Play商店中使用此炫酷的实用应用。它挽救了我的一天:) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender
Xamarin 费利克斯港的答案
在您的中MainActivity
,添加以下内容(docs:Android.App.IntentFilterAttribute Class):
....
[IntentFilter(new[] {
Intent.ActionView },
Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
DataScheme = "my.special.scheme")
]
public class MainActivity : Activity
{
....
Xamarin将为您添加以下内容AndroidManifest.xml
:
<activity
android:label="Something"
android:screenOrientation="portrait"
android:theme="@style/MyTheme"
android:name="blah.MainActivity">
<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="my.special.scheme" />
</intent-filter>
</activity>
为了获取参数(我在MainActivity的OnCreate中进行了测试):
var data = Intent.Data;
if (data != null)
{
var scheme = data.Scheme;
var host = data.Host;
var args = data.PathSegments;
if (args.Count > 0)
{
var first = args[0];
var second = args[1];
...
}
}
据我所知,以上内容可以添加到任何活动中,而不仅仅是MainActivity
笔记:
OnCreate
应用程序的事件MainLauncher Activity
将再次被触发。<a href="my.special.scheme://host/arg1/arg2">
,在以上最后一个代码中,代码段值将为:scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2
更新:如果android创建您的应用程序的新实例,您也应该添加android:launchMode="singleTask"
。
Felix处理深层链接的方法是处理深层链接的典型方法。我还建议您检查该库以处理深层链接的路由和解析:
https://github.com/airbnb/DeepLinkDispatch
您可以使用批注为特定的深层链接URI注册您的Activity,它将为您提取参数,而无需执行获取路径段,匹配之类的通常繁琐的工作。您可以像这样简单地批注和activity :
@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
...
}
嘿,我找到了解决方案。我没有将类别设置为“默认”。另外,我还在针对意图数据使用Main活动。现在,我对意图数据使用了不同的活动。谢谢您的帮助。:)
example.php:
<?php
if(!isset($_GET['app_link'])){ ?>
<iframe src="example.php?app_link=YourApp://blabla" style="display:none;" scrolling="no" frameborder="0"></iframe>
<iframe src="example.php?full_link=http://play.google.com/xyz" style="display:none;" scrolling="no" frameborder="0"></iframe>
<?php
}
else { ?>
<script type="text/javascript">
self.window.location = '<?php echo $_GET['app_link'];?>';
window.parent.location.href = '<?php echo $_GET['full_link'];?>';
</script>
<?php
}
截至15/06/2019
我所做的是包括所有四个打开URL的可能性。
即,带有http
/ https
和2 www
的前缀,而带有2 的前缀www
通过使用此程序,我的应用程序现在可以自动启动,而无需我选择浏览器和其他选项。
<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="https" android:host="example.in" />
<data android:scheme="https" android:host="www.example.in" />
<data android:scheme="http" android:host="example.in" />
<data android:scheme="http" android:host="www.example.in" />
</intent-filter>