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


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>

los MediaColumns.DATA la información siempre devuelve nulo y el MediaColumns.DISPLAY_NAME siempre devuelve image.jpg sin importar 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.


32
2017-11-06 07:01


origen


Respuestas:


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

32
2017-11-07 12:11



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 comprobar si hay alguna autoridad está o no en 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í 


1
2018-06-24 07:07



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

0
2017-10-02 10:35