Android 意图锚语法描述
我正试图使用意图锚来启动我的应用程序,如前所述。我可以用这个语法让它启动我的应用程序Android 意图锚语法描述,android,android-intent,Android,Android Intent,我正试图使用意图锚来启动我的应用程序,如前所述。我可以用这个语法让它启动我的应用程序 <a href="intent://#Intent;scheme=http;package=com.example.myapp;end">Launch my app</a> 每个片段的含义是什么(因此我知道如何最好地利用它们) 如何/在何处包括任何额外数据(即我自己的参数) 下面是来自Intent类的方法toUri(): public String toUri(int flags) {
<a href="intent://#Intent;scheme=http;package=com.example.myapp;end">Launch my app</a>
下面是来自
Intent
类的方法toUri()
:
public String toUri(int flags) {
StringBuilder uri = new StringBuilder(128);
String scheme = null;
if (mData != null) {
String data = mData.toString();
if ((flags&URI_INTENT_SCHEME) != 0) {
final int N = data.length();
for (int i=0; i<N; i++) {
char c = data.charAt(i);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|| c == '.' || c == '-') {
continue;
}
if (c == ':' && i > 0) {
// Valid scheme.
scheme = data.substring(0, i);
uri.append("intent:");
data = data.substring(i+1);
break;
}
// No scheme.
break;
}
}
uri.append(data);
} else if ((flags&URI_INTENT_SCHEME) != 0) {
uri.append("intent:");
}
uri.append("#Intent;");
if (scheme != null) {
uri.append("scheme=").append(scheme).append(';');
}
if (mAction != null) {
uri.append("action=").append(Uri.encode(mAction)).append(';');
}
if (mCategories != null) {
for (String category : mCategories) {
uri.append("category=").append(Uri.encode(category)).append(';');
}
}
if (mType != null) {
uri.append("type=").append(Uri.encode(mType, "/")).append(';');
}
if (mFlags != 0) {
uri.append("launchFlags=0x").append(Integer.toHexString(mFlags)).append(';');
}
if (mPackage != null) {
uri.append("package=").append(Uri.encode(mPackage)).append(';');
}
if (mComponent != null) {
uri.append("component=").append(Uri.encode(
mComponent.flattenToShortString(), "/")).append(';');
}
if (mSourceBounds != null) {
uri.append("sourceBounds=")
.append(Uri.encode(mSourceBounds.flattenToString()))
.append(';');
}
if (mExtras != null) {
for (String key : mExtras.keySet()) {
final Object value = mExtras.get(key);
char entryType =
value instanceof String ? 'S' :
value instanceof Boolean ? 'B' :
value instanceof Byte ? 'b' :
value instanceof Character ? 'c' :
value instanceof Double ? 'd' :
value instanceof Float ? 'f' :
value instanceof Integer ? 'i' :
value instanceof Long ? 'l' :
value instanceof Short ? 's' :
'\0';
if (entryType != '\0') {
uri.append(entryType);
uri.append('.');
uri.append(Uri.encode(key));
uri.append('=');
uri.append(Uri.encode(value.toString()));
uri.append(';');
}
}
}
uri.append("end");
return uri.toString();
}
以下是几个例子:
启动应用程序:
<a href="intent://#Intent;scheme=http;package=com.example.myapp;end">
使用一个名为“foo”的额外字符串启动应用程序,该字符串包含值“bar123”:
使用一个名为“foo”的额外字符串(包含值“bar123”)和一个名为“number”的额外整数(包含值“-567”)启动应用程序:
在android 28上,API发生了变化。以下是
toUri
代码已更改为的内容:
public String toUri(@UriFlags int flags) {
StringBuilder uri = new StringBuilder(128);
if ((flags&URI_ANDROID_APP_SCHEME) != 0) {
if (mPackage == null) {
throw new IllegalArgumentException(
"Intent must include an explicit package name to build an android-app: "
+ this);
}
uri.append("android-app://");
uri.append(mPackage);
String scheme = null;
if (mData != null) {
scheme = mData.getScheme();
if (scheme != null) {
uri.append('/');
uri.append(scheme);
String authority = mData.getEncodedAuthority();
if (authority != null) {
uri.append('/');
uri.append(authority);
String path = mData.getEncodedPath();
if (path != null) {
uri.append(path);
}
String queryParams = mData.getEncodedQuery();
if (queryParams != null) {
uri.append('?');
uri.append(queryParams);
}
String fragment = mData.getEncodedFragment();
if (fragment != null) {
uri.append('#');
uri.append(fragment);
}
}
}
}
toUriFragment(uri, null, scheme == null ? Intent.ACTION_MAIN : Intent.ACTION_VIEW,
mPackage, flags);
return uri.toString();
}
String scheme = null;
if (mData != null) {
String data = mData.toString();
if ((flags&URI_INTENT_SCHEME) != 0) {
final int N = data.length();
for (int i=0; i<N; i++) {
char c = data.charAt(i);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|| (c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+') {
continue;
}
if (c == ':' && i > 0) {
// Valid scheme.
scheme = data.substring(0, i);
uri.append("intent:");
data = data.substring(i+1);
break;
}
// No scheme.
break;
}
}
uri.append(data);
} else if ((flags&URI_INTENT_SCHEME) != 0) {
uri.append("intent:");
}
toUriFragment(uri, scheme, Intent.ACTION_VIEW, null, flags);
return uri.toString();
}
publicstringtouri(@UriFlags int-flags){
StringBuilder uri=新的StringBuilder(128);
如果((标志和URI\u ANDROID\u应用程序\u方案)!=0){
如果(mPackage==null){
抛出新的IllegalArgumentException(
“意图必须包含显式包名才能生成android应用程序:”
+这),;
}
append(“android应用程序:/”);
追加(mPackage);
字符串scheme=null;
如果(mData!=null){
scheme=mData.getScheme();
if(scheme!=null){
追加('/');
追加(scheme);
字符串权限=mData.getEncodedAuthority();
if(authority!=null){
追加('/');
uri.append(权限);
字符串路径=mData.getEncodedPath();
if(路径!=null){
追加(路径);
}
字符串queryParams=mData.getEncodedQuery();
if(queryParams!=null){
追加('?');
追加(queryParams);
}
String fragment=mData.getEncodedFragment();
if(片段!=null){
uri.append(“#”);
追加(片段);
}
}
}
}
toUriFragment(uri,null,scheme==null?Intent.ACTION\u MAIN:Intent.ACTION\u视图,
包装、旗帜);
返回uri.toString();
}
字符串scheme=null;
如果(mData!=null){
字符串数据=mData.toString();
如果((标志和URI\u意图\u方案)!=0){
final int N=data.length();
对于(int i=0;i='a'&&c='a'&&c='0'&&c0){
//有效方案。
scheme=data.substring(0,i);
追加(“意图:”);
数据=数据子串(i+1);
打破
}
//没有计划。
打破
}
}
追加(数据);
}else if((标志和URI\u意图\u方案)!=0){
追加(“意图:”);
}
toUriFragment(uri、scheme、Intent.ACTION\u视图、null、标志);
返回uri.toString();
}
这表明选择的答案将不再有效
检查工作解决方案。此结构基本上未记录。一个更好的解决方案,而不是手工制作URL,是在Java中创建一个
Intent
对象,该对象将执行您想要的操作,然后对其调用toUri()
,以生成要使用的URL。还请注意,并非所有浏览器都能识别此URL结构。请进一步解释您的建议。你是说JavaScript吗?我不认为JavaScript支持意图,也不能保证Java安装在客户机上。“你是说JavaScript吗?”--不,我是说Java。Android应用程序通常使用Java编程语言编写。用Java创建一个Android应用程序,该应用程序创建一个Intent
对象,该对象将执行您想要的操作,然后在其上调用toUri()
,以生成要使用的URL。对,但我需要从浏览器启动该应用程序。你是说基本上反向工程的链接,我需要吗?无论完全支持与否,你知道如何包括额外使用这种结构?我想我可以在scheme
标记中抛出一个字符串,然后尝试解析它……非常酷,谢谢!看起来我可以使用.getStringExtra(“foo”)
无法将数组类型额外嵌入uri:(@KenIchi你不能拥有一切!你为什么要这样做?@DavidWasser,因为我想通过adb am
命令传递双倍额外,但为此,除了一些数组额外,我必须使用uri格式,但这是不可能的。
S = String
B = Boolean
b = Byte
c = Character
d = Double
f = Float
i = Integer
l = Long
s = Short
<a href="intent://#Intent;scheme=http;package=com.example.myapp;end">
<a href="intent://#Intent;scheme=http;package=com.example.myapp;S.foo=bar123;end">
<a href="intent://#Intent;scheme=http;package=com.example.myapp;S.foo=bar123;i.number=-567;end">
public String toUri(@UriFlags int flags) {
StringBuilder uri = new StringBuilder(128);
if ((flags&URI_ANDROID_APP_SCHEME) != 0) {
if (mPackage == null) {
throw new IllegalArgumentException(
"Intent must include an explicit package name to build an android-app: "
+ this);
}
uri.append("android-app://");
uri.append(mPackage);
String scheme = null;
if (mData != null) {
scheme = mData.getScheme();
if (scheme != null) {
uri.append('/');
uri.append(scheme);
String authority = mData.getEncodedAuthority();
if (authority != null) {
uri.append('/');
uri.append(authority);
String path = mData.getEncodedPath();
if (path != null) {
uri.append(path);
}
String queryParams = mData.getEncodedQuery();
if (queryParams != null) {
uri.append('?');
uri.append(queryParams);
}
String fragment = mData.getEncodedFragment();
if (fragment != null) {
uri.append('#');
uri.append(fragment);
}
}
}
}
toUriFragment(uri, null, scheme == null ? Intent.ACTION_MAIN : Intent.ACTION_VIEW,
mPackage, flags);
return uri.toString();
}
String scheme = null;
if (mData != null) {
String data = mData.toString();
if ((flags&URI_INTENT_SCHEME) != 0) {
final int N = data.length();
for (int i=0; i<N; i++) {
char c = data.charAt(i);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|| (c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+') {
continue;
}
if (c == ':' && i > 0) {
// Valid scheme.
scheme = data.substring(0, i);
uri.append("intent:");
data = data.substring(i+1);
break;
}
// No scheme.
break;
}
}
uri.append(data);
} else if ((flags&URI_INTENT_SCHEME) != 0) {
uri.append("intent:");
}
toUriFragment(uri, scheme, Intent.ACTION_VIEW, null, flags);
return uri.toString();
}