谁能指导我如何从android浏览器启动我的android应用程序?
使用<intent-filter>和<data>元素。例如,要处理所有到twitter.com的链接,你可以把这个放在<activity>中的AndroidManifest.xml中:
<intent-filter>
<data>
<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>
然后,在你的web应用中,你可以添加如下链接:
<a href="my.special.scheme://other/parameters/here">
当用户点击它时,你的应用程序将自动启动(因为它可能是唯一一个可以处理my.special.scheme://类型的uri的应用程序)。唯一的缺点是,如果用户没有安装应用程序,他们会得到一个讨厌的错误。我不确定有什么办法能查到。
my.special.scheme://
为了回答你的问题,你可以使用getIntent().getData()来返回一个Uri对象。然后你可以使用Uri.*方法来提取你需要的数据。例如,假设用户点击了指向http://twitter.com/status/1234的链接:
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方法。
Activity
onCreate()
params.size()
嘿,我有办法了。我没有将类别设置为“默认”。此外,我使用的主要活动的意图数据。现在我正在使用一个不同的活动的意图数据。谢谢你的帮助。:)
你需要添加一个伪主机名到CALLBACK_URL 'app://'作为URL没有意义,不能被解析。
还应该将<category android:name="android.intent.category.BROWSABLE"/>添加到意图过滤器中,以便从链接中正确识别活动。
<category android:name="android.intent.category.BROWSABLE"/>
请在这里看到我的评论:让一个链接在安卓浏览器启动我的应用程序?
我们强烈反对人们使用他们自己的方案,除非他们正在定义一个新的全球互联网方案。
在我的例子中,我必须为<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>
下面的链接给出了直接从浏览器启动应用程序(如果已安装)的信息。否则它会直接在游戏商店中打开应用程序,以便用户可以无缝下载。
https://developer.chrome.com/multidevice/android/intents
截至2014年1月28日,以上所有答案都不适合我使用CHROME
CHROME
我的应用程序正确启动从http://example.com/someresource/链接从应用程序,如hangouts, 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元素
pathPrefix
你的应用程序现在将出现在活动选择器内,每当用户请求http://example.com/someresource/模式从chrome浏览器点击谷歌搜索结果或任何其他网站的链接
请注意,如果你的图标从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>
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 }
Felix处理深度链接的方法是处理深度链接的典型方法。我还建议您查看这个库来处理深层链接的路由和解析:
https://github.com/airbnb/DeepLinkDispatch
您可以使用注释为特定的深链接URI注册Activity,它将为您提取参数,而不必执行获取路径段、匹配它等通常的繁琐操作。你可以像这样简单地注释和活动:
@DeepLink("somePath/{someParameter1}/{someParameter2}") public class MainActivity extends Activity { ... }
例如,你有下面的事情:
打开应用程序的链接:http://example.com
应用程序的包名:com.example.mypackage
接下来你需要做的是:
为你的Activity添加一个intent filter (可以是任何你想要的活动。有关更多信息,请检查文档)
<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文件来测试链接或使用这个方法。
直接打开你的活动(只打开你的活动,没有选择对话框)。
用浏览器或程序打开此链接(通过选择对话框)
使用移动Chrome测试
没有必要在市场上发布应用程序来测试深度链接=)
此外,要了解更多信息,请检查文档和有用的演讲。
费利克斯的答案的Xamarin的端口
在你的MainActivity中,添加这个(文档:Android.App。IntentFilterAttribute类< / >):
MainActivity
.... [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>
为了获得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
注:
MainLauncher Activity
OnCreate
<a href="my.special.scheme://host/arg1/arg2">
scheme: my.special.scheme host: host args: ["arg1", "arg2"] first: arg1 second: arg2
更新:如果android创建了你的应用程序的新实例,你也应该添加android:launchMode="singleTask"。
android:launchMode="singleTask"
看@JRuns在在这里中的答案。这个想法是用您的自定义方案创建html,并将其上传到某个地方。然后,如果你点击你的html文件上的自定义链接,你将被重定向到你的应用程序。我使用这文章为android。但是不要忘记为你的目标活动设置全名Name = "MyApp.Mobile.Droid.MainActivity"属性。
Name = "MyApp.Mobile.Droid.MainActivity"
截至2019年6月15日
我所做的是包括所有四种打开url的可能性。
例如,有http / https, 2有www前缀,2没有www
http
https
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>