ACTION_PICK图像选择器返回不同的uri格式

时间:2016-09-14 11:59:39

标签: android uri android-gallery

我正在使用图像选择器选择图像,然后将此图像上传到服务器。

  

我的代码在除之外的所有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用于上传。

1 个答案:

答案 0 :(得分:1)

DATA的{​​{1}}列无需为您提供可以使用的文件系统路径。例如,图像可能位于Android 4.4+上的可移动存储上,MediaStore可以访问,但您不能。 MediaStore也可以在其索引图片中包含非设备本地图片,但来自Google照片等服务(因此我已被告知)。

所以,你的第一步是摆脱MediaStore,因为它不可靠。

最简单,最高效的解决方案是找到一种方法来压缩图像并在服务器上进行多部分图像上传。没有文件系统访问权限例如,您可以通过getImagePath()上的InputStream访问openInputStream(),这对您问题中显示的两种ContentResolver类型都有效。使用Uri找到一些方法来完成您的工作。

如果您确定无法做到这一点,则无论如何都需要获取InputStream并制作内容的本地副本(例如,在InputStream中)。然后,使用本地副本,完成后将其删除。