Подтвердить что ты не робот

Android 5.1.1 lollipop возвращает пустой путь к файлу, если изображение выбрано из галереи

Android 5.1.1 lollipop возвращает пустой путь к файлу, если изображение выбрано из галереи. Нижеприведенный код отлично работает на всех устройствах, перечисленных ниже 5.1.1, но не работает в lollipop 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.

4b9b3361

Ответ 1

На данный момент я получил это для получения изображения из галереи. Я тестировал его на 4.4, 5.0.1 и 5.1.1, но он должен работать и с предыдущими версиями (с новым и старым приложением Google для фото), должен быть менее взломанным и не требует проверки версии 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 не удовлетворен этим неофициальным взломом.

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) {

                }
            }
        }