您的位置:

详解Android Uri

一、Uri的概念

Uri,即Uniform Resource Identifier,统一资源标志符,是Web上所有资源的唯一标识符。

在Android中,Uri可以代表不同的数据类型,如文件、图片、音频等。

Uri以字符串的形式存在,主要格式为:scheme://host:port/path?query#fragment。其中,scheme表示模式,如http、https等;host表示主机名;port表示端口号;path是主机名后面的部分;query表示查询参数;fragment表示片段标识符。

二、Uri的使用方式

在Android开发中,Uri可以通过以下方式来使用:

1. 通过资源ID获取Uri

    Uri uri = Uri.parse("android.resource://packageName/" + R.raw.my_movie);

此处的“my_movie”为raw目录下的文件名,packageName为当前应用程序的包名。

2.通过文件路径获取Uri

    Uri uri = Uri.parse("file:///sdcard/my_image.jpg");

此处的“my_image.jpg”为文件名,/sdcard/为文件路径。

3.通过ContentProvider获取Uri

    Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null); 
    if (cursor != null) {
        while (cursor.moveToNext()) {
            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            Uri uri = Uri.parse("file://" + path);
        }
        cursor.close();
    }

通过ContentResolver查询图片文件的Uri。

三、Uri的使用场景

1.用作Intent的数据

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri uri = Uri.parse("http://www.example.com");
    intent.setData(uri);
    startActivity(intent);

通过Uri打开网页。

2.用作ContentProvider的数据

ContentProvider可以将存储在SQLite数据库、文件系统或Web上的数据暴露给其他应用程序。

    //在MyContentProvider中的query方法中
    Cursor cursor = db.query(tableName, projection, selection, selectionArgs, null, null, sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;

通过Uri将MyContentProvider中的数据暴露出去。

3.用作图片资源的地址

    Glide.with(context)
        .load(Uri.parse("content://media/external/images/media/123"))
        .into(imageView);

通过Uri加载图片。

四、Uri的注意事项

1.权限问题

访问文件系统需要申请访问权限,如读写外部存储需要在Manifest中声明Permission。

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.Uri的编码问题

Uri中可能包含一些特殊字符,如空格、&、#等,需要对这些字符进行编码。

    String encodedString = URLEncoder.encode(uriString, "UTF-8")

3.Uri的区分大小写问题

Android中的Uri是区分大小写的,相同的Uri如果大小写不同,会被认为是不同的Uri。

4.Uri的空指针问题

在将字符串转换为Uri时,需要进行非空判断,避免出现空指针异常。

    if (!TextUtils.isEmpty(uriString)) {
        Uri uri = Uri.parse(uriString);
    }

五、总结

Uri是Android中非常重要的一个概念,它在许多场合都有广泛的应用。在使用Uri时,需要注意字符串的编码、空指针异常、权限问题等。我们需要在开发过程中灵活运用Uri,为我们的应用增添更多的功能和特性。