是否可以建立如下链接:
<a href="anton://useful_info_for_anton_app">click me!</a>
导致我的Anton应用启动?
我知道这适用于具有市场协议的Android Market应用,但是其他应用可以做类似的事情吗?
以下是启动Android电子市场的链接示例:
<a href="market://search?q=pname:com.nytimes.android">click me!</a>
更新
我接受eldarerat提供的答案很有用,但我只是想提一下我对<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>
答案 0 :(得分:269)
请不要使用你自己的定制方案! URI方案是网络全局命名空间。你在世界范围内拥有“anton:”计划吗?没有?然后不要使用它。
一种选择是建立一个网站,并为该网站上的特定URI设置一个intent-filter。例如,这就是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,浏览器在单击时将尝试启动它。要构建这样的方案,最好的方法是只编写代码来构造你想要启动的Intent,然后打印intent.toUri(Intent.URI_INTENT_SCHEME)的结果。
您可以使用具有此意图的操作来查找支持该操作的任何活动。出于安全原因,浏览器会在启动之前自动将BROWSABLE类别添加到intent中;它也会因同样的原因剥离你提供的任何显式组件。
使用此功能的最佳方式是,如果您想确保仅启动您的应用,则使用您自己的作用域操作并使用Intent.setPackage()来表示Intent仅匹配您的应用包。
两者之间的权衡:
http URIs要求您拥有自己的域名。用户将始终获得在浏览器中显示URI的选项。它有非常好的后备属性,如果你的应用程序没有安装,它们只会降落在你的网站上。
意图URI要求您的应用已安装且仅在Android手机上安装。允许几乎任何意图(但始终包含BROWSABLE类别,不支持显式组件)。它们允许您将启动定向到您的应用,而无需用户选择转到浏览器或任何其他应用。
答案 1 :(得分:92)
我认为您需要查看Mainfest文件的<intent-filter>
元素。具体来说,请查看<data>
子元素的文档。
基本上,您需要做的是定义自己的方案。有点像:
<intent-filter>
<data android:scheme="anton" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <--Not positive if this one is needed
...
</intent-filter>
然后,您应该可以使用以anton:
URI方案开头的链接启动您的应用。
答案 2 :(得分:13)
我为宣传自己而道歉,但我有一个jQuery插件,可以通过网络链接https://github.com/eusonlito/jquery.applink启动原生应用
您可以轻松使用它:
<script>
$('a[data-applink]').applink();
</script>
<a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a>
答案 3 :(得分:12)
我也遇到过这个问题,看到很多荒谬的页面。我已经了解到要使您的应用程序可浏览,请更改XML元素的顺序,这个:
<activity
android:name="com.example.MianActivityName"
android:label="@string/title_activity_launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<data android:scheme="http" />
<!-- or you can use deep linking like -->
<data android:scheme="http" android:host="xyz.abc.com"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
这对我有用,可能对你有帮助。
答案 4 :(得分:6)
这是我的食谱:
创建一个静态HTML,重定向到您请求的应用程序URL,将该页面放在网络上。
这样,就Android而言,您分享的链接是“真正的”链接(它们将是“可点击的”)。
您'共享'常规HTTP链接,www.your.server.com / foo / bar.html 此URL返回一个简单的8行HTML,重定向到您应用的URI(window.location =“blah:// kuku”)(请注意,'blah'不必再是HTTP或HTTPS)。
启动并运行后,您可以使用上面建议的所有奇特功能来扩充HTML。
这适用于内置浏览器,Opera和Firefox(尚未测试任何其他浏览器)。 Firefox询问'此链接需要使用应用程序打开'(确定,取消)。其他浏览器显然不太担心安全性,他们只是打开应用程序,没有问题。
答案 5 :(得分:4)
为您的应用设置设置了意图和自定义网址方案后,接收页顶部的这个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.open(custom_url, '_blank')
上为您抛出一个很好的例外,它也会失败并返回null
,您可以稍后进行测试。
更新:使用store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
链接到Android上的Google Play。
答案 6 :(得分:4)
您可能需要考虑使用库来处理应用程序的深层链接:
https://github.com/airbnb/DeepLinkDispatch
您可以像上面建议的人一样在带注释的活动上添加意图过滤器。它将处理所有深层链接的参数的路由和解析。例如,您的MainActivity可能具有以下内容:
@DeepLink("somePath/{useful_info_for_anton_app}")
public class MainActivity extends Activity {
...
}
它也可以处理查询参数。
答案 7 :(得分:2)
此方法不会调用消除歧义对话框,要求您打开应用程序或浏览器。
如果您在清单中注册了以下内容
<manifest package="com.myApp" .. >
<application ...>
<activity ...>
<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="gallery"
android:scheme="myApp" />
</intent-filter>
</activity>
..
,然后从手机上的电子邮件中单击此URL,例如
<a href="intent://gallery?directLink=true#Intent;scheme=myApp;package=com.myApp;end">
Click me
</a>
然后android将尝试找到具有包 com.myApp 的应用,该应用可响应您的图库意图并具有 myApp 方案。如果无法解决问题,它将带您到商店,寻找应该是您的应用的 com.myApp 。
答案 8 :(得分:1)
尝试我的简单技巧:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(url.startsWith("classRegister:")) {
Intent MnRegister = new Intent(getApplicationContext(), register.class); startActivity(MnRegister);
}
view.loadUrl(url);
return true;
}
和我的HTML链接:
<a href="classRegister:true">Go to register.java</a>
或者你可以制作&lt; a href =“classRegister: true ”&gt; &lt; - 类名
的“true”值但是这个脚本适用于mailto链接:)
if (url.startsWith("mailto:")) {
String[] blah_email = url.split(":");
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("text/plain");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)");
Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be);
startActivity(emailIntent);
}
答案 9 :(得分:0)
只想通过浏览器打开应用?您可以使用以下代码实现它:
HTML:
<a href="intent:#Intent;action=packageName;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;end">Click here</a>
清单:
<intent-filter>
<action android:name="packageName" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
这个意图过滤器应该在启动器活动中。
如果您想通过点击浏览器链接传递数据,只需参考this link。