是否可以建立这样的链接:

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

当前回答

我想你会想看看Manifest文件中的<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方案开头的链接来启动你的应用了。

其他回答

你可能想要考虑一个库来处理你的应用程序的深层链接:

https://github.com/airbnb/DeepLinkDispatch

你可以像上面建议的那样在一个带注释的Activity上添加intent过滤器。它将处理所有深度链接的参数路由和解析。例如,你的MainActivity可能有这样的东西:

@DeepLink("somePath/{useful_info_for_anton_app}")
public class MainActivity extends Activity {
   ...
}

它还可以处理查询参数。

请不要像那样使用你自己的自定义方案!!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.

一旦你为你的应用设置了意图和自定义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。

试试我的简单技巧:

        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>

或者你可以为类文件名设置< a href="classRegister:true" > <- "true"值

不过,这个脚本适用于mailto link:)

        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);
        }

我也遇到过这个问题,看到过很多荒谬的页面。我了解到,要让你的应用程序可浏览,改变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>

这招对我很管用,也许也能帮到你。