是否可以建立这样的链接:
<a href="anton://useful_info_for_anton_app">click me!</a>
让我的安东应用启动吗
我知道这适用于Android Market应用程序的市场协议,但类似的事情是否也适用于其他应用程序?
下面是一个将启动Android Market的链接示例:
<a href="market://search?q=pname:com.nytimes.android">click me!</a>
更新:
我接受eldarerathis提供的答案很好,但我只想提一下,我在<intent-filter>标记的子元素的顺序方面遇到了一些问题。我建议您简单地使用该标记中的新子元素制作另一个<intent-filter>,以避免我遇到的问题。例如,我的AndroidManifest.xml看起来是这样的:
<activity android:name=".AntonWorld"
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>
<data android:scheme="anton" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
一旦你为你的应用设置了意图和自定义url方案,接收页面顶部的javascript代码对我来说在iOS和Android上都有效:
<script type="text/javascript">
// if iPod / iPhone, display install app prompt
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i) ||
navigator.userAgent.match(/android/i)) {
var store_loc = "itms://itunes.com/apps/raditaz";
var href = "/iphone/";
var is_android = false;
if (navigator.userAgent.match(/android/i)) {
store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
href = "/android/";
is_android = true;
}
if (location.hash) {
var app_loc = "raditaz://" + location.hash.substring(2);
if (is_android) {
var w = null;
try {
w = window.open(app_loc, '_blank');
} catch (e) {
// no exception
}
if (w) { window.close(); }
else { window.location = store_loc; }
} else {
var loadDateTime = new Date();
window.setTimeout(function() {
var timeOutDateTime = new Date();
if (timeOutDateTime - loadDateTime < 5000) {
window.location = store_loc;
} else { window.close(); }
},
25);
window.location = app_loc;
}
} else {
location.href = href;
}
}
</script>
这个功能只在Android浏览器上测试过。Firefox和Opera我不太确定。关键是即使Android浏览器不会在window上为你抛出一个很好的异常。打开(custom_url, '_blank'),它将失败并返回null,您可以稍后进行测试。
更新:使用store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";链接到Android上的谷歌Play。
请不要像那样使用你自己的自定义方案!!URI方案是一个网络全局命名空间。你在全球拥有“anton:”计划吗?没有?那就不要用它。
一种选择是拥有一个网站,并为该网站上的特定URI设置一个意图过滤器。例如,这是Market在其网站上拦截uri的方法:
<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="market.android.com"
android:path="/search" />
</intent-filter>
或者,还有“意图:”方案。这允许你将几乎任何Intent描述为URI,浏览器将在单击时尝试启动该URI。要构建这样一个方案,最好的方法是只编写代码来构造你想要启动的Intent,然后打印Intent. touri (Intent. uri_intent_scheme)的结果。
您可以使用具有此意图的操作来查找支持该操作的任何活动。出于安全考虑,浏览器会在启动intent之前自动添加BROWSABLE类别;它还将删除您出于相同原因提供的任何显式组件。
如果你想确保它只启动你的应用程序,最好的方法是使用你自己的作用域动作,并使用Intent. setpackage()表示Intent只匹配你的应用程序包。
两者之间的权衡:
http URIs require you have a domain you own. The user will always get the option to show the URI in the browser. It has very nice fall-back properties where if your app is not installed, they will simply land on your web site.
intent URIs require that your app already be installed and only on Android phones. The allow nearly any intent (but always have the BROWSABLE category included and not supporting explicit components). They allow you to direct the launch to only your app without the user having the option of instead going to the browser or any other app.