一、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,为我们的应用增添更多的功能和特性。