画廊意图问题中的文件不存在?
File does not exist from gallery intent issue?
我正在使用 ACTION_PICK 意图从画廊获取图像:-
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, 112);
在 onActivityResult() 中,我通过 getData()
获取图像,其中 returns 我的 uri :- /external/images/media/6097
现在,当我通过 imageview 的 setImageUri()
方法在 imageview 中设置此 uri 时,图像正在显示,但是当我创建文件对象以通过 :-[=17 将此图像上传到服务器时=]
File imageFile = new File(uri);
提示文件不存在。 imageFile.exists()
返回 false。
不知道哪里出了问题。我已经在 genymotion 和设备上尝试过,但结果是一样的。
在清单中,我已授予权限:-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
尝试从 uri 获取绝对路径并使用绝对路径而不是 uri 创建文件实例:
public String getAbsolutePath(Uri uri) {
if (Build.VERSION.SDK_INT >= 19) {
String id = "";
if (uri.getLastPathSegment().split(":").length > 1)
id = uri.getLastPathSegment().split(":")[1];
else if (uri.getLastPathSegment().split(":").length > 0)
id = uri.getLastPathSegment().split(":")[0];
if (id.length() > 0) {
final String[] imageColumns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION};
Uri tempUri = getUri();
Cursor imageCursor = getContentResolver().query(tempUri, imageColumns, MediaStore.Images.Media._ID + "=" + id, null, null);
if (imageCursor.moveToFirst()) {
return imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
} else {
return null;
}
} else {
return null;
}
} else {
String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.Images.Media.ORIENTATION};
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else
return null;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == getActivity().RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
Uri selectedImageUri = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getActivity().getContentResolver().query(selectedImageUri,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
if (!TextUtils.isEmpty(picturePath)) {
Log.v(TAG, "SELECT_PICTURE... " + picturePath);
}
}
} else {
Toast.makeText(getActivity(), " File discarded...", Toast.LENGTH_LONG).show();
}
}
我正在使用 ACTION_PICK 意图从画廊获取图像:-
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, 112);
在 onActivityResult() 中,我通过 getData()
获取图像,其中 returns 我的 uri :- /external/images/media/6097
现在,当我通过 imageview 的 setImageUri()
方法在 imageview 中设置此 uri 时,图像正在显示,但是当我创建文件对象以通过 :-[=17 将此图像上传到服务器时=]
File imageFile = new File(uri);
提示文件不存在。 imageFile.exists()
返回 false。
不知道哪里出了问题。我已经在 genymotion 和设备上尝试过,但结果是一样的。 在清单中,我已授予权限:-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
尝试从 uri 获取绝对路径并使用绝对路径而不是 uri 创建文件实例:
public String getAbsolutePath(Uri uri) {
if (Build.VERSION.SDK_INT >= 19) {
String id = "";
if (uri.getLastPathSegment().split(":").length > 1)
id = uri.getLastPathSegment().split(":")[1];
else if (uri.getLastPathSegment().split(":").length > 0)
id = uri.getLastPathSegment().split(":")[0];
if (id.length() > 0) {
final String[] imageColumns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION};
Uri tempUri = getUri();
Cursor imageCursor = getContentResolver().query(tempUri, imageColumns, MediaStore.Images.Media._ID + "=" + id, null, null);
if (imageCursor.moveToFirst()) {
return imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
} else {
return null;
}
} else {
return null;
}
} else {
String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.Images.Media.ORIENTATION};
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else
return null;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == getActivity().RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
Uri selectedImageUri = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getActivity().getContentResolver().query(selectedImageUri,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
if (!TextUtils.isEmpty(picturePath)) {
Log.v(TAG, "SELECT_PICTURE... " + picturePath);
}
}
} else {
Toast.makeText(getActivity(), " File discarded...", Toast.LENGTH_LONG).show();
}
}