我想创建一个Android应用程序,以便在Android操作系统中注册(或者只是在系统启动时启动),当手机用户在Web浏览器内的特殊按钮上点击时,例如:
<a href="myapp://mysettings">Foo</a>
我的应用程序将通过在URL中发送的参数弹出并运行。
那么我要如何做到呢?
我需要一份带代码的教程!
我想创建一个Android应用程序,以便在Android操作系统中注册(或者只是在系统启动时启动),当手机用户在Web浏览器内的特殊按钮上点击时,例如:
<a href="myapp://mysettings">Foo</a>
我的应用程序将通过在URL中发送的参数弹出并运行。
那么我要如何做到呢?
我需要一份带代码的教程!
首先,为了能够从浏览器/邮件中使用自定义方案“myapp”启动您的应用程序,请将意图过滤器设置如下。
<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="myapp"/>
</intent-filter>
为了解析链接中的查询,可以使用以下代码:myapp://someaction/?var=str&varr=string (该代码过于简单,没有错误检查。)
Intent intent = getIntent();
// check if this intent is started via custom scheme link
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Uri uri = intent.getData();
// may be some test here with your custom uri
String var = uri.getQueryParameter("var"); // "str" is set
String varr = uri.getQueryParameter("varr"); // "string" is set
}
[编辑] 如果您使用自定义协议启动应用程序,则其中一个问题是: 其他应用程序中的 WebView 可能无法理解您的自定义协议。 这可能会导致使用自定义协议的链接在浏览器中显示 404 页面。
getIntent().toUri(Intent.URI_INTENT_SCHEME).toString()
,将其粘贴到网页(http://commonsware.com/sample)中,在模拟器上尝试在浏览器中打开它,但是我得到的选择是在浏览器、联系人或电话中打开页面,而不是我的活动。考虑到来自`toUri()`的`intent:` URI具有component
子句,这似乎很奇怪,因此我不确定那些其他应用程序如何获取它。我在意图过滤器上有BROWSABLE
类别。如果您有任何想法,请回复我。谢谢! - CommonsWare这是我的直截了当的贡献。
在您想要在清单中加载的活动中创建意图过滤器,如下所示:
<intent-filter>
<action android:name="com.bubblebeats.MY_CUSTOM_ACTION" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
您的网页URL应该是这样的:
intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end
从浏览器启动您的apk的最基本的HTML代码如下所示:
<body>
<a href="intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end">click to load apk</a>
</body>
添加变量到您的意图
您可以在Android代码中像这样生成URI:
Intent i = new Intent();
i.setAction("com.bubblebeats.MY_CUSTOM_ACTION");
i.putExtra("some_variable", "123456");
Log.d("ezpz", i.toUri(Intent.URI_INTENT_SCHEME));
这将会产生这个结果:04-13 09:47:30.742: DEBUG/ezpz(9098): intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end
你只需要这部分内容:
intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end
仔细观察这里发生了什么,你可以看到如何跳过代码步骤并手动创建这些URI。
特别是这部分:
S.some_variable=123456
package=com.bubblebeats;
这样的形式中(此外,虽然在这个例子中不明显,但是包已经进行了URI编码)。 - nmrtoUri()
的输出似乎不是一个好主意。 - cYrusintent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end
。即使我直接将其放入短信中,我认为它也不会可点击,或者它会吗? - Shobhit Puri因为hackbod没有给我们提供代码示例,所以我想在我成功实现后分享我的代码。
首先,您需要在清单文件中定义一个自定义操作:
<activity
android:name=".activity.MainActivity"
android:label="@string/app_name_full">
<intent-filter>
<action android:name="com.yourpackage.action.OPEN_VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="android.intent.category.BROWSABLE"></category>
</intent-filter>
</activity>
接下来,对于你网站上的内容,你需要从意图中生成URI。 将以下代码放在你的Activity中(一旦链接被生成,该代码可以被移除):
Intent i = new Intent();
i.setAction("com.yourpackage.action.OPEN_VIEW");
i.setPackage("com.yourpackage");
i.putExtra("myextra","anystring");
Log.d(getClass().getSimpleName(), i.toUri(Intent.URI_INTENT_SCHEME));
final Intent intent = getIntent();
final String action = intent.getAction();
if ("com.yourpackage.action.OPEN_VIEW".equals(action)) {
Log.i(getClass().getSimpleName(), "EXTRA: "+intent.getExtras().getString("myextra"));
}
在您的网站上(这是之前生成的链接):
<a href="intent:#Intent;action=com.yourpackage.action.OPEN_VIEW;package=com.yourpackage;S.myextra=anystring;end">Open App with extra</a>
希望这能帮助一些人更好地理解。如果我有误,请纠正我。