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

Posted

技术标签:

【中文标题】从 android 浏览器启动自定义 android 应用程序【英文标题】:Launch custom android application from android browser 【发布时间】:2011-02-26 20:56:23 【问题描述】:

谁能指导我如何从安卓浏览器启动我的安卓应用程序?

【问题讨论】:

【参考方案1】:

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

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

你的应用的包名:com.example.mypackage

那你需要做下一步:

    为您的活动添加一个意图过滤器 (可以是您想要的任何活动。有关更多信息,请查看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> 
    

    创建一个 html 文件来测试链接或使用this methods.

    直接打开您的活动(只需打开您的活动,无需选择对话框)。

    Open this link with browser or your programm (by choosing dialog).

    使用移动版 Chrome 进行测试

    就是这样。

而且没有必要在市场上发布应用来测试深度链接 =)

另外,有关更多信息,请查看documentation 和有用的presentation。

【讨论】:

我必须创建 html 文件并上传它才能使其正常工作。我想知道为什么,尤其是第二个,不能直接从浏览器(chrome)工作。 如何通过此链接向应用发送数据?【参考方案2】:

Xamarin 移植 Felix 的答案

在您的 MainActivity 中,添加以下内容(文档: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="blah.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>

为了获取参数(我在 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];
        ...
    

据我所知,上面可以添加到任何activity中,不仅仅是MainActivity

注意事项:

    当用户点击链接时,Android 操作系统会重新启动您的应用程序(如果有的话,杀死 prev 实例并运行新的实例),这意味着应用程序的 MainLauncher ActivityOnCreate 事件将被触发再次。 使用此链接:&lt;a href="my.special.scheme://host/arg1/arg2"&gt;,在上面 last 代码中,sn-p 值将是:
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

更新:如果 android 为您的应用创建新实例,您也应该添加 android:launchMode="singleTask"

【讨论】:

【参考方案3】:

截至 2014 年 1 月 28 日,以上所有答案都不适用于 CHROME

我的应用从 http://example.com/someresource/ 链接正确启动,来自环聊、gmail 等应用的链接,但不是从 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 元素

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

【讨论】:

这对我帮助很大。非常感谢!请在此处发布您的答案,以便我奖励您赏金! ***.com/questions/21663001/… 这是什么语言? 你好,我知道它太旧了。我也在同样的情况下感到震惊。我已经指定了 pathPrefix、scheme 和 host,但它不起作用。我只尝试了方案,然后它起作用了。但是当我添加主机时,它停止工作。知道可能是什么问题吗? 花了几天的时间才得到这个答案。在没有 pathPrefix 元素的情况下,不确定它对整个世界的工作方式。尽管按照文档做了所有事情,但从未在 chrome 上为我工作过。非常感谢。【参考方案4】:

截至 2019 年 6 月 15 日

我所做的是包括所有四种打开 url 的可能性。

即,http / https 和 2 带有 www 前缀和 2 不带 www

通过使用它,我的应用程序现在会自动启动,而无需我选择浏览器和其他选项。

<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="https" android:host="example.in" />
    <data android:scheme="https" android:host="www.example.in" />
    <data android:scheme="http" android:host="example.in" />
    <data android:scheme="http" android:host="www.example.in" />

</intent-filter>

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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 

【讨论】:

这会创建两个不可见的 iframe:深层链接和普通链接。如果应用程序已安装,深层链接 iframe 将启动它。如果不是,则显示正常链接。通过一些额外的工作,可以在安装应用程序后调用深层链接的地方实现延迟深层链接。【参考方案7】:

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

https://github.com/airbnb/DeepLinkDispatch

您可以使用注释为特定的深度链接 URI 注册您的 Activity,它会为您提取参数,而无需执行获取路径段、匹配它等通常的繁琐操作。您可以简单地注释和像这样的活动:

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

【讨论】:

【参考方案8】:

以下链接提供了有关直接从浏览器启动应用程序(如果已安装)的信息。否则直接在play store打开应用,方便用户无缝下载。

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

【讨论】:

【参考方案9】:

请注意,当您实现此功能时,如果您的图标从 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>

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

我们强烈劝阻人们不要使用他们自己的方案,除非他们正在定义一个新的全球互联网方案。

【讨论】:

Hackbod 是 Android 平台背后的 Google 工程师之一。遵循这个建议可能是个好主意。事实上,像这样的自定义方案支持似乎在 Honeycomb 中中断了。 我不对 ios 对开发者施加的限制负责。 ;) 对此负责?不。但是您可以考虑到这一点,因为无论您喜不喜欢,这些限制都会强加给您的许多开发人员 hackbod 正在回答一个专门针对 Android 的问题。没有提到 iOS,所以不需要考虑它。 @hackbod 将方案命名空间(即 href="com.ourdomain.myapp//whatever")是一个好习惯,假设可以在不同的网站上找到这样的链接?【参考方案12】:

就我而言,我必须为&lt;intent-filter&gt; 设置两个类别,然后它就起作用了:

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

【讨论】:

这里一样,需要添加额外的类别。 有人能解释一下完成这项工作的实际过程是什么吗?任何指向确切实施的链接,先决条件都会有所帮助。谢谢 在开发设置上测试。其实我给了一个错误的域名。我的错。 评分最高的答案对我不起作用,但确实如此。谢谢。 什么是服务器端的 href 链接?【参考方案13】:

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

【讨论】:

作为参考,添加 CATEGORY_BROWSABLE 意味着“浏览器可以安全地调用目标 Activity 以显示链接引用的数据——例如,图像或电子邮件消息。” 这是一个现有的类别还是您正在提议一个新的类别? 它存在。显然,您应该在不同的意图过滤器标签中拥有单独的网站主机,否则会导致问题。 不只是 BROWSABLE,还有 android.intent.category.DEFAULT - 所以链接可以在其他应用程序中打开,比如电子邮件(不仅仅是浏览器)【参考方案14】:

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

【讨论】:

【参考方案15】:

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

【讨论】:

听起来不太可能(尽管我认识到这是一个老问题,也许事情已经改变了。)来自developer.android.com/guide/components/intents-filters.html#ifs“为了通过类别测试,Intent 对象中的每个类别 必须匹配 filter 中的类别。过滤器可以列出其他类别,但不能省略意图中的任何类别。"【参考方案16】:

使用&lt;intent-filter&gt;&lt;data&gt; 元素。例如,要处理所有指向 twitter.com 的链接,您可以将其放在 &lt;activity&gt; 中的 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 方法。

【讨论】:

非常感谢您的及时回复。但是你能告诉我如何访问“my.special.scheme://”之后的参数吗? 我已经编辑了我的答案以包含有关如何从 Uri 中提取数据的说明。如果您认为此答案是已接受的,请单击它旁边的复选标记,将其标记为已接受(仅)。 如果目标安卓应用没有安装怎么办?如何处理。 任何像我一样无法让这个方案工作的人,需要在清单中将android:exported="true" 添加到他们的Activity。检查这个答案***.com/a/13044911/1276636 不确定这对整个世界有什么作用。只是在 chrome 上不起作用,它总是在浏览器中打开链接,直到您放置“android:pathPrefix”元素。无论如何,答案没有文档中提到的类别值。如果它仍然对某人不起作用,请参考:***.com/a/21727055/2695276 PS:为此挣扎了好几天。

以上是关于从 android 浏览器启动自定义 android 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

OneSignal - 使用来自 url 的自定义图像从 android 应用发送通知

使用自定义类启动浏览器意图 - 找不到活动

在android中制作自定义组件

如何从自定义 Android 应用程序启动 uber eats 应用程序

Android:具有自定义视图的 AppWidget 不起作用

我可以在 android 布局包含标签上设置自定义属性吗?