play perfil normal google descargar crear aplicación actualizar android google-plus android-contentprovider google-photos

android - perfil - google+ web



Descargar la imagen de la nueva aplicación Google+(más) Fotos (3)

Recientemente, Google agregó la aplicación Fotos para Google+ (más) y se muestra cuando se inicia una intención para elegir una imagen. Sin embargo, si selecciono una imagen de Fotos de Google+ y trato de usarla en mi aplicación, ninguna de mi lógica actual puede devolver un URI o URL utilizable para obtener realmente una imagen que pueda descargar y manipular. Actualmente estoy usando los métodos "comunes" para tratar de manipular el URI que se puede encontrar aquí en Stack Overflow y en otros lugares. Puedo proporcionar el código si es necesario, pero en este punto, creo que es un poco irrelevante, ya que funciona bien para todo lo demás, excepto esta nueva aplicación. ¿Alguna idea sobre cómo obtener una imagen útil?

El URI se parece a lo siguiente:

content://com.google.android.apps.photos.content/0/https%3A%2F%2Flh5.googleusercontent.com%<a bunch of letters and numbers here>

La información de MediaColumns.DATA siempre devuelve null y MediaColumns.DISPLAY_NAME siempre devuelve MediaColumns.DISPLAY_NAME independientemente de lo que seleccione de la aplicación Google Photos. Si trato de pegar todo desde https hasta el final en mi navegador, no aparece nada. No estoy seguro de cómo obtener información útil de esto.


Al recibir el intento de datos, debe usar contentResolver para obtener las fotos. Esto es lo que debes hacer:

String url = intent.getData().toString(); Bitmap bitmap = null; InputStream is = null; if (url.startsWith("content://com.google.android.apps.photos.content")){ is = getContentResolver().openInputStream(Uri.parse(url)); bitmap = BitmapFactory.decodeStream(is); }


Debes usar la proyección para obtener ImageColumns.DATA (o MediaColumns.DATA ):

private String getRealPathFromURI(Uri contentURI) { // Projection makes ContentResolver to get needed columns only String[] medData = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(contentURI, medData, null, null, null); // this is how you can simply get Bitmap Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), contentURI); // After using projection cursor will have needed DATA column cursor.moveToFirst(); final int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); return cursor.getString(idx); }


Me enfrenté a problemas al seleccionar imágenes de la nueva aplicación Google Fotos. Pude resolverlo por el siguiente código.

Funciona para mí, básicamente lo que hice es verificar si hay alguna autoridad presente o no en el URI de contenido. Si está allí, estoy escribiendo en el archivo temporal y devolviendo la ruta de esa imagen temporal. Puede omitir la parte de compresión al escribir en una imagen temporal

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); }

PD: He respondido una pregunta similar aquí