在Android浏览器中建立一个链接启动我的应用程序?

时间:2010-08-12 16:33:08

标签: android

是否可以建立如下链接:

<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>

10 个答案:

答案 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