2015-05-29 2 views
41

Мое приложение имеет возможность выбрать фотографию из библиотеки. Точно я хочу путь к файлу из этого выбора.Выбирая фотографию с помощью нового приложения Google Фото

Это код, чтобы создать намерение для выбора фото:

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, 
     MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    photoPickerIntent.setType("image/*"); 
    startActivityForResult(photoPickerIntent, INTENT_REQUEST_CODE_SELECT_PHOTO); 

Это код, который получает путь к файлу из URI:

Cursor cursor = null; 
    String path = null; 
    try { 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     cursor = context.getContentResolver().query(contentUri, projection, null, null, null); 
     int columnIndex = cursor.getColumnIndexOrThrow(projection[0]); 
     cursor.moveToFirst(); 
     path = cursor.getString(columnIndex); 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
    return path; 

До вчерашнего дня обновления Google Фото приложения все работало отлично хорошо. Теперь path имеет значение null после разбора URI.

URI похож на это: content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL

Я также пытался создать намерения с действием Intent.ACTION_GET_CONTENT - не повезло.

ответ

41

Ниже код работает для меня, чтобы получить содержание URI на последнем Google Фото, а также. Что я пробовал писать в файл temp и возвращать URI временного изображения, если у него есть полномочия в URI контента.

Вы можете попробовать то же самое:

public static String getImageUrlWithAuthority(Context context, Uri uri) { 
    InputStream is = null; 
    if (uri.getAuthority() != null) { 
     try { 
      is = context.getContentResolver().openInputStream(uri); 
      Bitmap bmp = BitmapFactory.decodeStream(is); 
      return writeToTempImageAndGetPathUri(context, bmp).toString(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     }finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return null; 
} 

public static Uri writeToTempImageAndGetPathUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
    return Uri.parse(path); 
} 
+2

Я принял этот ответ, хотя для нашего потока это немного обходное решение. Но это позволяет вернуть приложение обратно в полностью рабочее состояние, поэтому это имеет значение. Одна нота: я не выполнял декодирование Bitmap из InputStream - я скопировал его в какой-то файл File TempFile = new File («path_to_my_temp_directory»); а затем использовал последний для всего материала. –

+0

@Akhil Спасибо за это! – Petro

+0

'is = context.getContentResolver(). OpenInputStream (uri);' возвращает значение null. Кажется, я не могу найти решение для выбора изображений из приложения Google для фотографий. Если у кого-то есть рабочее решение, пожалуйста, поделитесь. – ArJ

6

Это, безусловно, обходной путь, но вы могли бы извлечь реальное содержание URI, который, по-видимому становится внедренным по некоторым причинам: content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209

Я был в состоянии создать новый URI с authority=media and path=external/images/media/xxx, и распознавателем содержания вернулся реальным URL.

Пример код:

String unusablePath = contentUri.getPath(); 
int startIndex = unusablePath.indexOf("external/"); 
int endIndex = unusablePath.indexOf("/ACTUAL"); 
String embeddedPath = unusablePath.substring(startIndex, endIndex); 

Uri.Builder builder = contentUri.buildUpon(); 
builder.path(embeddedPath); 
builder.authority("media"); 
Uri newUri = builder.build(); 
+1

Вы можете поделиться исходный код для этого? –

+0

Не могли бы вы поделиться источником этого решения? застрял в этом вопросе на пару дней! – Vishy

+2

добавлен пример кода –

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