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();
    }