【问题标题】:Android 5.1.1 lollipop return null file path if image chosen from gallery如果从图库中选择图像,Android 5.1.1 lollipop 返回空文件路径
【发布时间】:2015-06-01 06:44:36
【问题描述】:

如果从图库中选择图像,Android 5.1.1 lollipop 返回空文件路径。下面的代码在 5.1.1 以下的所有设备中都可以正常工作,但在棒棒糖 5.1.1 中不起作用

Uri contentUri = data.getData();
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();
        }
    }

cursor.getString(column_index) 这返回 null。

【问题讨论】:

  • android 升级到 5.1.1 后遇到同样的问题,请帮忙!!!
  • lollipop return null file path if image chosen from gallery.。不会。在 onActivityResult 中,您将一如既往地获得有效的内容提供者 uri contentUri。你用它做什么是不同的。
  • 能否添加日志

标签: android


【解决方案1】:

现在我已经完成了从图库中获取图像的方法。我已经在 4.4、5.0.1 和 5.1.1 上对其进行了测试,但它应该也可以在以前的版本上运行(使用新旧 Google 照片应用程序),应该不那么 hacky 并且不需要检查 Android 版本。

public static Uri handleImageUri(Uri uri) {
    if (uri.getPath().contains("content")) {
        Pattern pattern = Pattern.compile("(content://media/.*\\d)");
        Matcher matcher = pattern.matcher(uri.getPath());
        if (matcher.find())
            return Uri.parse(matcher.group(1));
        else
            throw new IllegalArgumentException("Cannot handle this URI");
    }
    return uri;
}

有了这个,我使用了我以前用来获取图像路径的相同代码:

public static String getRealPathFromURI(Context context, Uri uri) {
    Cursor cursor = null;
    try {
        Uri newUri = handleImageUri(uri);
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(newUri,  proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } catch (Exception e){
        return null;
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

【讨论】:

    【解决方案2】:

    对于 android lollipop 5.1.1 的临时破解。现在工作正常。但是 m 对这种非官方的 hack 并不满意。

    Uri selectedImage = data.getData();
            if (Build.VERSION.SDK_INT == 22) {
                if (selectedImage != null && selectedImage.toString().length() > 0) {
                    try {
                        final String extractUriFrom = selectedImage.toString();
                        String firstExtraction = extractUriFrom.contains("com.google.android.apps.photos.contentprovider") ? extractUriFrom.split("/1/")[1] : extractUriFrom;
                        firstExtraction = firstExtraction.contains("/ACTUAL") ? firstExtraction.replace("/ACTUAL", "").toString() : firstExtraction;
    
                        String secondExtraction = URLDecoder.decode(firstExtraction, "UTF-8");
                        selectedImage = Uri.parse(secondExtraction);
                    } catch (UnsupportedEncodingException e) {
    
                    } catch (Exception e) {
    
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多