作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有解码 content://
URI 的代码:
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(contentUri,
new String[] { MediaStore.Files.FileColumns.DATA },
null, null, null);
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
cursor.moveToFirst();
return cursor.getString(columnIndex);
} finally {
if (cursor != null) {cursor.close()};
}
但它不适用于 FileProvider
URI(例如下载文件的 Chrome Dev URI:content://com.chrome.dev.FileProvider/downloads/
) .有没有办法得到真实的路径?
最佳答案
您可以尝试使用此解决方案从文件提供程序 URI 获取真实路径。
首先,您需要定义文件提供程序路径文件,如下所示。
provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="/storage/emulated/0" path="."/>
</paths>
在 AndroidMenifest.xml 中声明文件提供程序如下。
AndroidMenifest.xml
<application>
.
.
.
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
现在在 Activity 端。
MyActivity.java
private Uri picUri;
private void takePhotoFromCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Utils.isNougat()) {
picUri = FileProvider.getUriForFile(this, getPackageName(), imageHelper
.createImageFile());
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}else {
picUri = Uri.fromFile(imageHelper.createImageFile());
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, picUri);
startActivityForResult(intent, Const.ServiceCode.TAKE_PHOTO);
}
/**
* This method is used for handel result after captured image from camera .
*/
private void onCaptureImageResult() {
if(Utils.isNougat()){
documentImage = imageHelper.getRealPathFromURI(picUri.getPath());
}else {
documentImage = imageHelper.getRealPathFromURI(picUri);
}
}
按照我的方法获取真实路径。
public String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = context.getContentResolver().query(contentURI, null,
null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file
// path
result = contentURI.getPath();
} else {
cursor.moveToFirst();
try {
int idx = cursor
.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
} catch (Exception e) {
AppLog.handleException(ImageHelper.class.getName(), e);
Toast.makeText(context, context.getResources().getString(
R.string.error_get_image), Toast.LENGTH_SHORT).show();
result = "";
}
cursor.close();
}
return result;
}
希望你能解决你的问题。
关于java - 如何从 FileProvider URI 获取真实路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45186747/
我是一名优秀的程序员,十分优秀!