2015-06-01 9 views
11

Android 5.1.1 lollipop возвращает пустой путь к файлу, если изображение выбрано из галереи. Ниже код работает отлично во всех устройствах ниже 5.1.1, но не работает в леденец 5.1.1Android 5.1.1 lollipop return null путь к файлу, если изображение выбрано из галереи

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) это возвращает нуль.

+1

получать такой же вопрос после обновления андроида 5.1.1, пожалуйста, помогите !!! –

+1

'lollipop возвращает пустой путь к файлу, если изображение выбрано из галереи.'. Нет. В onActivityResult вы всегда будете получать действительный контент-провайдер uri 'contentUri'. То, что вы с ним делаете, - это нечто иное. – greenapps

+0

Можете ли вы добавить журналы, пожалуйста, –

ответ

3

Для временного взлома для android lollipop 5.1.1. Теперь он отлично работает. Но я не удовлетворен этим неофициальным взломом.

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

       } 
      } 
     } 
+0

, пожалуйста, уточните, когда вы получите официальное решение –

9

На данный момент я получил это для получения изображения из галереи. Я тестировал его на 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(); 
     } 
    } 
} 
+0

Единственный ответ, который на самом деле работает! спасибо @Mat –

Смежные вопросы