2012-01-26 3 views
19

Mi aplicación genera imágenes que un usuario puede guardar o compartir con otras personas. El siguiente código funciona para la mayoría de las aplicaciones: Messenger, Facebook, Dropbox, correo electrónico, etc. Es decir, la aplicación elegida carga la imagen y el usuario puede compartir la imagen con éxito con esa aplicación.Compartir una imagen con la aplicación Google+ con Intent.ACTION_SEND e Intent.EXTRA_STREAM

Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("image/png"); 
File o = new File(dir, "file.png"); 
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(o)); 
startActivity(Intent.createChooser(intent , "Send options")); 

Sin embargo, cuando decido Google+ en la lista de aplicaciones, Google + se inicia, pero la imagen no está incluido en la ventana posterior. En lugar de ello, Google + muestra un mensaje Tostada con:

"You can only post photos stored on your device." 

Esto es un poco confuso, porque la imagen está en la tarjeta SD externa, es decir /mnt/sdcard/AppDir/file.png. Estoy usando la última actualización de la aplicación de Google+ (2.3.1.242969).

¿Hay otro truco para compartir una imagen con google +?

Gracias.

ACTUALIZACIÓN:

Mi aplicación genera las imágenes que se comparten, por lo que el ejemplo siguiente de @ chirag-sha no era directamente aplicable. Pero, usar MediaStore parece la idea correcta. Me he decidido por el código básico a continuación:

void shareImage(int position) { 
    File f = getFileFor(position); 
    ContentValues values = new ContentValues(2); 
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/png"); 
    values.put(MediaStore.Images.Media.DATA, f.getAbsolutePath()); 
    Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
    Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.setType("image/png"); 
    intent.putExtra(Intent.EXTRA_STREAM, uri); 
    startActivity(Intent.createChooser(intent , "Send options")); 
} 

Esto funciona con Google+ y todas las demás aplicaciones con las que he probado. Dejaré la pregunta abierta en caso de que no sea una buena práctica. ¿Alguien puede confirmar que esta es la forma correcta de hacerlo?

Respuesta

9

Great catch! Puede especificar MediaStore Uri (que se parece al contenido : // media/external/images/media/42) en lugar de la ruta absoluta en el sistema de archivos.

Ejemplo:

public class MyActivity extends Activity { 
    ... 
    static final int IMAGE_REQUEST = 0; 

    protected void pickImage() { 
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, IMAGE_REQUEST); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == IMAGE_REQUEST) { 
     Uri uri = data.getData(); 

     Intent intent = new Intent(Intent.ACTION_SEND); 
     intent.setType("image/png"); 
     // uri looks like content://media/external/images/media/42 
     intent.putExtra(Intent.EXTRA_STREAM, uri); 
     startActivity(Intent.createChooser(intent , "Share")); 
    } 
    } 
} 
+0

Gracias por este consejo. Usar Media Store parece ser el camino correcto, y tu publicación me dio esa idea. –

2

La razón por la que está recibiendo este error es debido "en la tarjeta SD" no es "en su dispositivo".

Una discusión sobre este tema se puede encontrar aquí: https://groups.google.com/a/googleproductforums.com/forum/#!topic/google-plus-discuss/pdlOTM8JEXg/discussion

La solución a través de la MediaStore parece ser la única solución hasta que Google actualiza la aplicación de Google+ con una solución.

Actualización: la solución mencionada anteriormente solo funciona si desea compartir una imagen una sola vez. Si llama a ContentResolver.insert (...) varias veces, terminará mostrando la imagen varias veces en su galería. Se me ocurrió la siguiente solución que trata de obtener el ID existente de la imagen y si no existe, se puede insertar ...

Cursor c = getActivity().getContentResolver() 
      .query(Images.Media.EXTERNAL_CONTENT_URI, 
        null, 
        Images.Media.DATA + "=?", 
        new String[] { filePath }, null); 
    if (c.getCount() > 0 && c.moveToFirst()) { 
     Uri shareUri = Uri.withAppendedPath(
       Images.Media.EXTERNAL_CONTENT_URI, 
       "" 
         + c.getInt(c 
           .getColumnIndex(Images.Media._ID))); 
     c.close(); 

     startActivity(Intent.createChooser(
       new Intent(Intent.ACTION_SEND) 
         .putExtra(Intent.EXTRA_STREAM, 
           shareUri).setType(
            "image/*"), "")); 
    } else { 
    // ContentResolver.insert(...) and use that uri... 
    } 
+0

Parece que esto no siempre funciona: http: // stackoverflow.com/questions/23324485/android-mediastore-cant-get-insert-image-data –

3

Gracias por plantear esta pregunta!

Sí, parece que Google+ solo acepta medios de proveedores de contenido (content: // uris), no file: // uris. Entonces, debemos poner la imagen en MediaStore primero. Una forma más fácil de hacerlo es:

MediaStore.Images.Media.insertImage(context.getContentResolver(), tmpFile.getAbsolutePath(), tmpFile.getName(), null); 
Cuestiones relacionadas