本文介绍了在Android开发中将图片文件路径转化为Uri以及从Uri获取到文件路径的方法和相关代码示例。
在Android开发过程中,图片文件的路径地址与Uri是两种常见的表示方式。其中,Uri是一种统一资源标识符,用于跨应用共享数据;而路径地址则代表了文件系统中的具体位置。
### 从Uri获取文件路径
当使用`ContentResolver`处理时,首先需要判断给定的`uri`类型:
- 如果该uri为null或其scheme为空,则直接通过调用`getPath()`方法来获得对应的文件路径。
- 若uri的scheme是file(即File Uri),则同样可以通过调用`getPath()`获取到相应的本地文件地址。
- 对于Content Uri,需要使用`ContentResolver.query()`查询出对应的数据列,并从该Cursor中提取数据字段值作为实际文件路径。
示例代码如下:
```java
public static String getRealFilePath(Context context, Uri uri) {
if (uri == null)
return null;
final String scheme = uri.getScheme();
String data = null;
// 如果scheme为空或者为file,则直接获取path
if (null == scheme || ContentResolver.SCHEME_FILE.equals(scheme))
data = uri.getPath();
else if(ContentResolver.SCHEME_CONTENT.equals(scheme)) {
Cursor cursor = context.getContentResolver().query(uri, new String[]{ImageColumns.DATA}, null, null, null);
// 查询成功,获取cursor中的文件路径
if (cursor != null) {
int index = 0;
if(cursor.moveToFirst()) {
index = cursor.getColumnIndex(ImageColumns.DATA);
if(index > -1)
data = cursor.getString(index);
}
cursor.close();
}
}
return data; // 返回文件路径
}
```
### 文件路径转换成Uri
当已知图片的本地存储地址时,可以通过以下步骤获取到对应的`Content Uri`:
- 首先判断该path是否为有效的图片类型。
- 对于有效类型的文件,则利用MediaStore中的相关方法构建出一个指向外部存储器中对应位置的uri。
示例代码如下:
```java
private Uri filePathToUri(Context context, String path) {
if (path != null) {
// 创建File对象,然后转换成file uri
Uri uri = Uri.fromFile(new File(path));
// 判断是否为内容类型uri,并且路径包含图片相关数据时执行额外处理逻辑。
if(uri.getScheme().equals(ContentResolver.SCHEME_FILE) && path.contains(image)) {
ContentResolver cr = context.getContentResolver();
StringBuffer buff = new StringBuffer();
// 构造查询条件
buff.append(Images.ImageColumns.DATA).append(=)
.append(path);
Cursor cur = cr.query(
Images.Media.EXTERNAL_CONTENT_URI,
new String[]{ImageColumns._ID},
buff.toString(),
null, null);
int index = 0;
// 遍历Cursor,查找符合条件的记录
for(cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) {
index = cur.getColumnIndex(Images.ImageColumns._ID);
if(index > -1)
index = cur.getInt(index);
}
// 如果index为0,则说明没有匹配到任何数据;否则,根据索引构造出content uri
return (index == 0) ? null : Uri.parse(content://media/external/images/media/ + index);
}
return uri;
}
return null;
}
```
在实际操作中,请注意权限管理。自Android6.0(API级别23)起,访问外部存储需要动态请求`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限;对于Content Uri的获取,则可能还需要特定的读取或写入权限。
理解并掌握这些转换方法对处理图片及其他文件在Android应用中的操作至关重要。