有人可以指导我如何从Android浏览器启动我的Android应用程序吗?
答案 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商店中打开应用程序,以便用户可以无缝下载。
答案 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
注意:
OnCreate
事件MainLauncher Activity
将再次被解雇。<a href="my.special.scheme://host/arg1/arg2">
,在上面的最后代码段中,代码段值为: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