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

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

354420 次浏览

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

然后,在你的web应用中,你可以添加如下链接:

<a href="my.special.scheme://other/parameters/here">

当用户点击它时,你的应用程序将自动启动(因为它可能是唯一一个可以处理my.special.scheme://类型的uri的应用程序)。唯一的缺点是,如果用户没有安装应用程序,他们会得到一个讨厌的错误。我不确定有什么办法能查到。


为了回答你的问题,你可以使用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方法。

嘿,我有办法了。我没有将类别设置为“默认”。此外,我使用的主要活动的意图数据。现在我正在使用一个不同的活动的意图数据。谢谢你的帮助。:)

你需要添加一个伪主机名到CALLBACK_URL 'app://'作为URL没有意义,不能被解析。

还应该将<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

我的应用程序正确启动从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元素

你的应用程序现在将出现在活动选择器内,每当用户请求http://example.com/someresource/模式从chrome浏览器点击谷歌搜索结果或任何其他网站的链接

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

请注意,如果你的图标从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

接下来你需要做的是:

  1. 为你的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>
    
  2. 创建HTML文件来测试链接或使用这个方法。

    直接打开你的活动(只打开你的活动,没有选择对话框)。

    用浏览器或程序打开此链接(通过选择对话框)

  3. 使用移动Chrome测试

  4. < p >就是这样。

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

此外,要了解更多信息,请检查文档和有用的演讲

费利克斯的答案的Xamarin的端口

在你的MainActivity中,添加这个(文档:Android.App。IntentFilterAttribute类< / >):

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

注:

  1. 当用户点击链接,Android操作系统重新启动你的应用程序(杀死前一个实例,如果有,并运行一个新的),意味着应用程序的MainLauncher ActivityOnCreate事件将再次被触发。
  2. 使用这个链接:<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"

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

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