您可以尝试以下解决方案以获取文件提供程序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>
现在在活动页面上。
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);
}
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) {
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;
}
希望您解决问题。
ContentResolver#openInputStream
和ContentResolver#delete
。 - pskink