2015-05-29 9 views
41

Meine App verfügt über die Möglichkeit, ein Foto aus der Bibliothek auszuwählen. Genau ich möchte Dateipfad von dieser Auswahl.Die Auswahl des Fotos mit der neuen Google Fotos-App ist fehlerhaft

Dies ist der Code Absicht zur Auswahl Foto zu erstellen:

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

Dies ist der Code, den Dateipfad von URI bekommt:

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; 

Vor update gestern von Google Fotos perfekt funktioniert alles App fein. Jetzt path ist Null nach dem Parsing URI.

URI ist ähnlich wie folgt aus: content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL

ich auch Absicht mit Intent.ACTION_GET_CONTENT Aktion zu schaffen versucht - kein Glück. Diese

Antwort

41

Im Folgenden Code funktioniert für mich als auch Inhalt URI auf neuesten Google Fotos zu bekommen. Was ich versucht habe, schreibt in temporäre Datei und gibt den temporären Image-URI zurück, wenn es im Inhalts-URI Autorität hat.

können Sie versuchen, gleich:

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

Ich habe diese Antwort akzeptiert, obwohl für unseren Flow ist dies ein bisschen eine Ausweichlösung. Aber es erlaubt, die App zurück in den voll funktionsfähigen Zustand zu bringen, das zählt. Eine Anmerkung: Ich habe keine Bitmap-Decodierung von einem InputStream gemacht - ich habe es in eine Datei 'tempFile = new File (" path_to_my_temp_directory ") kopiert;' und dann die letzte für all das Zeug benutzt. –

+0

@Akhil Danke dafür! – Petro

+0

'ist = context.getContentResolver(). OpenInputStream (uri);' gibt null zurück. Ich kann anscheinend keine Lösung finden, um Bilder von der Google Fotos App auszuwählen. Wenn jemand eine funktionierende Lösung hat, bitte teilen. – ArJ

6

ist sicherlich eine Abhilfe, aber man konnte den wirklichen Inhalt URI extrahieren, die aus irgendeinem Grund eingebettet offenbar geworden ist: content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209

konnte ich einen neuen URI mit authority=media and path=external/images/media/xxx und Content-Resolver zurückgegeben erstellen eine echte URL

Beispielcode:

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

Können Sie einen Quellcode für das teilen? –

+0

Könnten Sie bitte die Quelle für diese Lösung teilen? seit ein paar Tagen in dieser Ausgabe stecken! – Vishy

+2

hinzugefügt Beispiel Code –

Verwandte Themen