2015-05-29 30 views
41

Moja aplikacja ma możliwość wyboru zdjęcia z biblioteki. Dokładnie chcę, aby ścieżka pliku z tego wyboru.Wybór zdjęcia przy użyciu nowej aplikacji Zdjęcia Google jest uszkodzony

Jest to kod, aby utworzyć intencję do wybierania zdjęciu:

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

Jest to kod, który pobiera ścieżkę dostępu do pliku z 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; 

Przed wczorajszą aktualizacją Zdjęcia Google App wszystko działało idealnie w porządku. Teraz path ma wartość NULL po przeanalizowaniu identyfikatora URI.

URI jest podobny do tego: content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL

Próbowałem też stworzyć intencyjny z działaniem Intent.ACTION_GET_CONTENT - bez powodzenia.

Odpowiedz

41

poniższy kod działa dla mnie, aby uzyskać zawartość URI na najnowszych Zdjęcia Google, jak również. Próbowałem napisać do pliku tymczasowego i identyfikatora URI obrazu temp. Powrotu, jeśli ma on uprawnienia w URI zawartości.

Możesz spróbować sam:

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

Przyjąłem tę odpowiedź, chociaż dla naszego przepływu jest to trochę obejście problemu. Ale pozwala przywrócić aplikację do stanu pełnego działania, więc to się liczy. Jedna uwaga: Nie zrobiłem dekodowania bitmapowego z InputStream - skopiowałem je do jakiegoś 'File tempFile = new File (" ścieżka_do_menu_templowego ") ;, a następnie użyłem ostatniego dla wszystkich rzeczy. –

+0

@Akhil Dzięki za to! – Petro

+0

'is = context.getContentResolver(). OpenInputStream (uri); zwraca wartość null. Nie mogę znaleźć żadnego rozwiązania do wybierania zdjęć z aplikacji Google do zdjęć. Jeśli ktokolwiek ma działające rozwiązanie, proszę udostępnij. – ArJ

6

Jest to z pewnością obejście, ale można wyodrębnić rzeczywistej treści URI, który najwyraźniej zostać osadzony z jakiegoś powodu: content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209

udało mi się utworzyć nowy URI z authority=media and path=external/images/media/xxx, a zawartość rezolwer powrócił prawdziwy URL.

Przykładowy kod:

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

można udostępniać kodu źródłowego do tego? –

+0

Czy mógłbyś udostępnić źródło tego rozwiązania? tkwi w tym wydaniu od kilku dni! – Vishy

+2

dodany przykładowy kod –