从Android浏览器启动自定义Android应用程序

时间:2010-06-02 14:34:54

标签: android android-intent intentfilter

有人可以指导我如何从Android浏览器启动我的Android应用程序吗?

16 个答案:

答案 0 :(得分:600)

使用带有<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方法。

答案 1 :(得分:66)

请在此处查看我的评论:Make a link in the Android browser start up my app?

我们强烈反对人们不使用他们自己的计划,除非他们正在定义一个新的全球互联网计划。

答案 2 :(得分:66)

截至2014年1月28日,所有上述答案对我CHROME无效

我的应用从适用于环聊,gmail等应用的http://example.com/someresource/链接正常启动,但未在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元素

只要用户通过点击谷歌搜索结果或任何其他网站上的链接从Chrome浏览器请求http://example.com/someresource/模式,您的应用就会显示在活动选择器中

答案 3 :(得分:47)

在我的情况下,我必须为<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>

答案 4 :(得分:21)

例如,你有接下来的事情:

  

打开应用的链接:http://example.com

     

您应用的套餐名称:com.example.mypackage

然后你需要做下一步:

1)为您的活动添加一个意图过滤器  (可以是您想要的任何活动。有关详细信息,请查看documentation)。

        <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文件以测试链接或使用this methods.

<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)就是这样。

没有必要在市场上发布应用程序以测试深层链接=)

另外,有关详细信息,请查看documentation和有用的presentation

答案 5 :(得分:18)

还应该在意图过滤器中添加<category android:name="android.intent.category.BROWSABLE"/>,以便从链接中正确识别活动。

答案 6 :(得分:8)

以下链接提供有关直接从浏览器启动应用程序(如果已安装)的信息。否则,它会直接在Play商店中打开应用程序,以便用户可以无缝下载。

https://developer.chrome.com/multidevice/android/intents

答案 7 :(得分:7)

请注意,当您实施此功能时,您的图标会从Android启动器中消失,而不是必须拆分意图过滤器。

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

答案 8 :(得分:6)

是的,Chrome搜索而不是寻找方案。如果要通过URI方案启动应用程序,请在Play商店中使用此酷实用程序App。它救了我的一天:) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender

答案 9 :(得分:4)

Xamarin 端口 Felix 的回答

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="blahblahblah.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>

为了获得params(我在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

注意:

  1. 当用户点击该链接时,Android操作系统重新启动您的应用(杀死prev实例,如果有的话,并运行新的,意味着应用的OnCreate事件MainLauncher Activity将再次被解雇。
  2. 使用以下链接:<a href="my.special.scheme://host/arg1/arg2">,在上面的最后代码段中,代码段值为:
  3. scheme: my.special.scheme
    host: host
    args: ["arg1", "arg2"]
    first: arg1
    second: arg2
    

答案 10 :(得分:3)

Felix处理深层链接的方法是处理深层链接的典型方法。我还建议检查这个库来处理深层链接的路由和解析:

https://github.com/airbnb/DeepLinkDispatch

您可以使用注释为特定的深层链接URI注册您的活动,它将为您提取参数,而无需执行获取路径段,匹配路径段等常用法规。您可以简单地注释和像这样的活动:

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

答案 11 :(得分:0)

嘿,我得到了解决方案。我没有将类别设置为“默认”。此外,我正在使用主要活动的意图数据。现在我对意图数据使用不同的活动。谢谢您的帮助。 :)

答案 12 :(得分:0)

您需要向CALLBACK_URL'app添加一个伪主机名://'作为一个URL没有意义,无法解析。

答案 13 :(得分:0)

使用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 
}

答案 14 :(得分:0)

here中查找@JRuns答案。这个想法是使用您的自定义方案创建html并将其上传到某个地方。然后,如果您在html文件上单击自定义链接,您将被重定向到您的应用程序。我在Android上使用过this文章。但是不要忘记为目标活动设置全名Name = "MyApp.Mobile.Droid.MainActivity"属性。

答案 15 :(得分:0)

截至2019年6月15日

我所做的就是包括所有四个打开URL的可能性。

即,带有user_id / account_id的前缀为http的2和没有https的前缀2的

并且通过使用此应用程序,我的应用程序现在可以自动启动,而无需要求我选择浏览器和其他选项。

www