我正在使用图像选择器选择图像,然后将此图像上传到服务器。
我的代码在除
之外的所有Android设备中都非常有效 电话。 For all device Uri returned is of type : content://media/external/images/media/523 For Mi devices Uri returned is of type:file:///storage/emulated/0/DCIM/Camera/IMG_20160912_160415.jpg
Cursor cursor = context.getContentResolver()。query()返回 如果uri的格式不是内容,则返回null:// *
private void pickImage() {
Intent photoPickerIntent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
if (selectedImageUri != null) {
selectedImagePath = Utils.getImagePath(selectedImageUri, DepositBankWireActivity.this);
Log.i("uplaod", "selectedImagePath" + selectedImagePath);
}
}
public static String getImagePath(Uri uri, Context context) {
Log.i("getImagePath",""+uri+" mime "+getMimeType(uri,context));
String[] projection = {MediaStore.MediaColumns.DATA,
MediaStore.Images.ImageColumns.ORIENTATION};
Cursor cursor = context.getContentResolver().query(uri, projection, null, null,
null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
是否有标准的方法来实现返回的图像选择器 来自uri的正确图像路径,例如 /storage/emulated/0/Pictures/Screenshots/test.png用于上传。
答案 0 :(得分:1)
DATA
的{{1}}列无需为您提供可以使用的文件系统路径。例如,图像可能位于Android 4.4+上的可移动存储上,MediaStore
可以访问,但您不能。 MediaStore
也可以在其索引图片中包含非设备本地图片,但来自Google照片等服务(因此我已被告知)。
所以,你的第一步是摆脱MediaStore
,因为它不可靠。
最简单,最高效的解决方案是找到一种方法来压缩图像并在服务器上进行多部分图像上传。没有文件系统访问权限例如,您可以通过getImagePath()
上的InputStream
访问openInputStream()
,这对您问题中显示的两种ContentResolver
类型都有效。使用Uri
找到一些方法来完成您的工作。
如果您确定无法做到这一点,则无论如何都需要获取InputStream
并制作内容的本地副本(例如,在InputStream
中)。然后,使用本地副本,完成后将其删除。