Manera correcta de compartir una imagen (usando Intents)

Creo imágenes en mi aplicación y quiero compartir estas redes sociales (facebook), aplicaciones de correo (gmail) y otras aplicaciones que pueden "recibir" imágenes.

El origen del problema (creo) es que no quiero usar el almacenamiento externo como base para mis imágenes. Quiero utilizar mi carpeta de datos o mi carpeta de caché ya que ninguno de estos requiere ningún permiso de acceso.

El código que utilizo para escribir mi imagen en archivo (y especifico el MODE_WORLD_READABLE para que otras aplicaciones puedan leerlos):

 FileOutputStream fos = null; try { fos = context.openFileOutput("image.jpg", Context.MODE_WORLD_READABLE); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); } finally { if (fos != null) fos.close(); } 

Y este es el código donde comparto la imagen:

 File internalFile = context.getFileStreamPath("image.jpg"); Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(internalFile)); intent.setType("image/jpeg"); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); context.startActivity(Intent.createChooser(intent, "share")); 

Esta solución es muy fácil y funciona bien para aplicaciones como facebook pero no por ejemplo gmail que falla con:

 file:// attachment paths must point to file:///mnt/sdcard 

Hay una serie de "hacks" (ver más abajo) para que funcione con gmail, pero me deja preguntándome si hay una manera aún mejor de compartir imágenes que funciona sin hacks, algo que pasé por alto. Así pues, a las preguntas:

  • ¿Cuál es la mejor manera de compartir imágenes? (¿almacenamiento externo?)
  • ¿Hay más aplicaciones que se comportan (mal) como Gmail? (He visto algunos problemas con google +)
  • Si no hay otra forma: ¿Puedo escribir intentos especiales para compartir aplicaciones específicas. ¿Tengo una forma predeterminada de compartir y anularla cuando el usuario selecciona una aplicación en mi lista de vigilancia?

Hacks

  1. Usando un path-hack simplemente señalando el Uri a:

    File: /// mnt / sdcard /../../ mi / paquete / nombre / …

    Esta solución no se siente bien.

  2. Uso de un ContentProvider como se describe aquí . Pero citado del enlace:

    Advertencia: el método descrito en la publicación funciona bien para Gmail, pero aparentemente tiene algunos problemas con otros manejadores de ACTION_SEND (por ejemplo, el compositor MMS).

    (Problema: bloquea el compositor MMS)

¿Has probado ParecelableFileDescriptor?

http://developer.android.com/reference/android/os/ParcelFileDescriptor.html

Crear con static ParcelFileDescriptor open(File file, int mode, Handler handler, ParcelFileDescriptor.OnCloseListener listener) Crear un nuevo ParcelFileDescriptor acceder a un archivo determinado. static ParcelFileDescriptor open(File file, int mode) Create a new ParcelFileDescriptor accessing a given file.

Lado receptor como este: Devolución de un flujo de entrada del descriptor de archivos de parcelas mediante Androids DownloadManager

Usted debe hacer 3 pasos.
Tomar la foto.

 public Bitmap takeScreenshot() { View rootView = findViewById(android.R.id.content).getRootView(); rootView.setDrawingCacheEnabled(true); return rootView.getDrawingCache(); } 

Guardar foto.

 public String saveBitmap(Bitmap bitmap) { File imagePath = new File(Environment.getExternalStorageDirectory() + “/screenshot.png”); FileOutputStream fos; try { fos = new FileOutputStream(imagePath); bitmap.compress(CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { Log.e(“GREC”, e.getMessage(), e); } catch (IOException e) { Log.e(“GREC”, e.getMessage(), e); } return imagePath.getAbsolutePath(); } 

Compartir en la red social.

  • Rotar un pivote de imagen en el Centro - Android
  • Cómo implementar efectos de distorsión de imagen en Android
  • Cómo mostrar la imagen de mapa de bits en Android
  • Cómo cargar la imagen en el servidor en Android?
  • Cómo convertir un objeto de imagen en un objeto de mapa de bits, Android
  • Imagen en lienzo con eventos táctiles
  • ¿Cómo enviar múltiples imágenes de las que están presentes en la carpeta de la unidad de google en android mediante programación?
  • Cómo obtener el ancho y la altura de la imagen mostrada en android?
  • Android + cargador universal de imágenes: muestra marcador personalizado con imagen en google map
  • Android - cómo configurar la imagen de fondo de pantalla
  • Android: cómo convertir todo ImageView a Bitmap?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.