当我选择文件并尝试获取其真实路径时,我的应用程序将转到ANR
。我的
public static String getRealPathFromUri(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = {MediaStore.Images.Media.DATA};
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
但如果我选择像图像这样的媒体文件,同样的工作正常。
适用于data.getData() = content://media/external/images/media/22555 real path
真实路径为/storage/emulated/0/DCIM/20150406_210053.jpg
对于非媒体文件,它转到ANR
data.getData() file:///storage/emulated/0/LenovoReaper/did
没有返回任何内容,应用程序转到ANR
。有人可以建议如何获得此类URI
的真实路径,还是应该从file://
中删除data.getData()
答案 0 :(得分:1)
要打开图库,请使用以下代码:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction("android.intent.action.PICK");
startActivityForResult(intent, PICK_IMAGE_REQUEST);
在 onActivityResult 中:
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
&& data != null && data.getData() != null) {
String absolutePath = "file://" + getPath(this,data.getData());
}
还有 getPath 函数:
public static String getPath( Context context, Uri uri ) {
String result = null;
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver( ).query( uri, proj, null, null, null );
if(cursor != null){
if ( cursor.moveToFirst( ) ) {
int column_index = cursor.getColumnIndexOrThrow( proj[0] );
result = cursor.getString( column_index );
}
cursor.close( );
}
if(result == null) {
result = "Not found";
}
Log.d(TAG, "onActivityResult: file://"+result);
return result;
}
它将为您提供图像的绝对路径,例如“file:///storage/emulated/0/LenovoReaper/did”
答案 1 :(得分:0)
有人可以建议如何获得这种URI的真实路径
没有"真正的路径"除了Uri
本身。
我应该从data.getData()
中删除file://
这对你没有任何好处。
A Uri
is not a File
。不要求任何Uri
必须指向您可以访问的文件。如果您想要访问Uri
所代表的数据,请使用ContentResolver
上的方法,例如openInputStream()
。