2015-05-29 9 views
41

La mia app è in grado di selezionare foto dalla libreria. Voglio esattamente il percorso del file da questa selezione.La scelta della foto utilizzando la nuova app Google Foto è interrotta

Questo è il codice per creare l'intento per la foto scelta:

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

Questo è il codice che ottiene il percorso del file da 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; 

Prima di aggiornamento di ieri di app Google Foto tutto ha funzionato alla perfezione bene. Ora path è nullo dopo aver analizzato l'URI.

URI è simile a questo: content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL

Ho anche cercato di creare intenti con l'azione Intent.ACTION_GET_CONTENT - senza fortuna.

risposta

41

Di seguito il codice sta lavorando per me per ottenere URI contenuti su tutte le Google Foto pure. Quello che ho provato è scrivere nel file temporaneo e restituire l'URI di immagine temp, se ha autorità nell'URI del contenuto.

Si può provare lo stesso:

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

Ho accettato questa risposta, anche se per il nostro flusso questo è un po 'una soluzione. Ma permette di riportare l'app a pieno regime, quindi questo conta. Una nota: non ho fatto una decodifica Bitmap da un InputStream - l'ho copiato in alcuni 'File tempFile = new File (" path_to_my_temp_directory ");' e poi usato l'ultimo per tutte le cose. –

+0

@Akhil Grazie per questo! – Petro

+0

'is = context.getContentResolver(). OpenInputStream (uri);' sta restituendo null. Non riesco a trovare alcuna soluzione per il prelievo di immagini dall'app di Google Foto. Se qualcuno ha una soluzione funzionante, per favore condividi. – ArJ

6

Questa è certamente una soluzione, ma si potrebbe estrarre il contenuto reale URI che ha a quanto pare si sono inseriti per qualche motivo: content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209

ero in grado di creare un nuovo URI con authority=media and path=external/images/media/xxx e contenuti resolver restituito un vero e proprio URL.

codice Esempio:

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

Puoi condividere qualsiasi codice sorgente per questo? –

+0

Potresti condividere la fonte per questa soluzione? bloccato a questo problema per un paio di giorni ora! – Vishy

+2

aggiunto codice di esempio –

Problemi correlati