Android URI总结

作者: 一只好奇的茂 | 来源:发表于2017-07-23 17:34 被阅读430次

    简介

    通用资源标志符(Universal Resource Identifier, 简称"URI")。
    Uri代表要操作的数据,Android上可用的每种资源 - 图像、视频片段等都可以用Uri来表示。从概念上来讲,URI包括URL。

    URI命名规则

    URI一般由三部分组成:
    在Android平台,URI主要分三个部分:scheme, authority and path。
    其中authority又分为host和port。格式如下:scheme://host:port/path
    例如:

    一些常用URI

    • 打开一个网页,类别是Intent.ACTION_VIEW
    Uri uri = Uri.parse(
    "[http://www.baidu.com/](http://www.baidu.com/)"
    );
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    
    • 打开地图并定位到一个点
    Uri uri = Uri.parse("geo:52.76,-79.0342");
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    
    • 打开拨号界面,类型是Intent.ACTION_DIAL
    Uri uri = Uri.parse("tel:10086");
    Intent intent = new Intent(Intent.ACTION_DIAL, uri);
    
    • 直接拨打电话,与之不同的是,这个直接拨打电话,而不是打开拨号界面
    Uri uri = Uri.parse("tel:10086");
    Intent intent = new Intent(Intent.ACTION_CALL, uri);
    
    • 卸载一个应用,Intent的类别是Intent.ACTION_DELETE
    Uri uri = Uri.fromParts("package", "xxx", null);
    Intent intent = new Intent(Intent.ACTION_DELETE, uri);
    

    更多请参考: android 常用URI 值得记住

    通过URI跳转到Activity

    实现从H5或第三方应用点击进入某应用。
    首先,在AndroidManifest.xml里面进行配置,在对应的Activity加上一个intent-filter, 如下:

    <activity
        android:name=".DestActivity"
        android:configChanges="orientation|keyboardHidden"
        android:exported="true"
        android:screenOrientation="portrait">
        <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="www.marsthink.com"
                android:path="/travel/oversea/"
                android:scheme="imarsthink" />
        </intent-filter>
    </activity>
    

    对应的Activity:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        Intent intent = getIntent();
        String action = intent.getAction();
        if (Intent.ACTION_VIEW.equals(action)) {
            Uri uri = intent.getData();
            if (uri != null) {
                String host = uri.getHost();
                String dataString = intent.getDataString();
                String id = uri.getQueryParameter("id");
                String path = uri.getPath();
                String path1 = uri.getEncodedPath();
                String queryString = uri.getQuery();
                Log.d("Alex", "host:"+host);
                Log.d("Alex", "dataString:" + dataString);
                Log.d("Alex", "id:" + id);
                Log.d("Alex", "path:" + path);
                Log.d("Alex", "path1:" + path1);
                Log.d("Alex", "queryString:" + queryString);
            }
        }
    }
    

    被调起时的log日志:

    host:www.marsthink.com  
    dataString:imarsthink://www.marsthink.com/travel/oversea?id=1000  
    id:1000  
    path:/travel/oversea
    path1:/travel/oversea
    queryString:id=1000  
    

    第三方App调起方式:

      Uri uri = Uri.parse("imarsthink://www.marsthink.com/travel/oversea?id=1000");
      Intent intent = new Intent(null, uri);
      startActivity(intent);
    

    H5调起方式:

    <a href="imarsthink://www.marsthink.com/travel/oversea?id=1000">open Android app</a>
    

    UriMatcher

    UriMatcher 类主要用于匹配Uri.
    使用方法如下,
    首先第一步,初始化:

    UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  
    

    第二步注册需要的Uri:

    matcher.addURI("com.yfz.Lesson", "people", PEOPLE);  
    matcher.addURI("com.yfz.Lesson", "person/#", PEOPLE_ID);  
    

    第三部,与已经注册的Uri进行匹配:

    Uri uri = Uri.parse("content://" + "com.yfz.Lesson" + "/people");  
    int match = matcher.match(uri);  
           switch (match)  
           {  
               case PEOPLE:  
                   return  "vnd.Android.cursor.dir/people";  
               case PEOPLE_ID:  
                   return  "vnd.android.cursor.item/people";  
               default:  
                   return null;  
           }  
    

    match方法匹配后会返回一个匹配码Code,即在使用注册方法addURI时传入的第三个参数。
    上述方法会返回

    vnd.Android.cursor.dir/person
    

    ContentUris

    ContentUris 类用于获取Uri路径后面的ID部分
    1)为路径加上ID: withAppendedId(uri, id)
    比如有这样一个Uri

    Uri uri = Uri.parse("content://com.yfz.Lesson/people")  
    

    通过withAppendedId方法,为该Uri加上ID

    Uri resultUri = ContentUris.withAppendedId(uri, 10);  
    

    最后resultUri为: content://com.yfz.Lesson/people/10
    2)从路径中获取ID: parseId(uri)

    Uri uri = Uri.parse("content://com.yfz.Lesson/people/10")  
    long personid = ContentUris.parseId(uri);  
    

    最后personid 为 :10

    ContentProvider:

    引用:ContentProvider和Uri详解

    相关文章

      网友评论

      本文标题:Android URI总结

      本文链接:https://www.haomeiwen.com/subject/qwrekxtx.html