2011-11-24 22 views
10

Tengo un ImageView con una intención de compartir (que funciona genial, muestra todas las aplicaciones con las que puedo compartir la imagen), sin embargo, no puedo compartir la foto porque no tiene una ruta en mi teléfono. ¿Cómo hago para guardar el ImageView en mi teléfono? A continuación está mi código.¿Cómo guardo un ImageView como una imagen?

public void taptoshare(View v) 
{ 
    View content = findViewById(R.id.myimage); 
    content.setDrawingCacheEnabled(true); 
     Bitmap bitmap = content.getDrawingCache(); 
     File file = new File("/DCIM/Camera/image.jpg"); 
     try 
     { 
      file.createNewFile(); 
      FileOutputStream ostream = new FileOutputStream(file); 
      bitmap.compress(CompressFormat.JPEG, 100, ostream); 
      ostream.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 


    Intent shareIntent = new Intent(Intent.ACTION_SEND); 
    Uri phototUri = Uri.parse("/DCIM/Camera/image.jpg"); 
    shareIntent.setData(phototUri); 
    shareIntent.setType("image/*"); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri); 
    startActivity(Intent.createChooser(shareIntent, "Share Via")); 

} 
} 

ACTUALIZACIÓN Ok, así que lo he descubierto. Ahora tengo una nueva pregunta, ¿cómo voy a guardar esta imagen en una nueva carpeta?

+0

Una nueva pregunta debe hacerse por separado, ya que no puede otorgar múltiples respuestas para una sola pregunta. Pero, de todos modos, File tiene un método mkdirs() que se puede usar para garantizar que exista la carpeta especificada. – AlbeyAmakiir

+0

oh ok gracias @AlbeyAmakiir! ¡Tomado en cuenta para publicaciones futuras! – dabious

Respuesta

4

Al guardar y cargar, primero debe obtener la ruta raíz del sistema. Así es como lo haría.

File root = Environment.getExternalStorageDirectory(); 
File cachePath = new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg"); 
+0

Lo he agregado pero todavía no funciona ... ¿Alguna sugerencia? – dabious

+0

¡funciona ahora! ¡¡Gracias un montón!! – dabious

+2

@dabious puede compartir la solución de trabajo. – User404

1

He encontrado un par de soluciones que no resuelven este problema.

Aquí hay una solución que funcionó para mí. Uno de gotcha es que necesita para almacenar las imágenes en un lugar privado no aplicación compartida o (http://developer.android.com/guide/topics/data/data-storage.html#InternalCache)

muchas sugerencias dicen almacenar en la ubicación de la caché Apps "privado", pero esto por supuesto no es accesible a través de otras aplicaciones externas, incluyendo el intento genérico de Compartir Archivo que se está utilizando. Cuando intente esto, se ejecutará, pero por ejemplo, Dropbox le dirá que el archivo ya no está disponible.

/* PASO 1 - Guarde el archivo de mapa de bits localmente usando la función de guardar archivo a continuación. */

localAbsoluteFilePath = saveImageLocally(bitmapImage); 

/* PASO 2 - Comparte la ruta de archivo absoluta no privado a la intención compartido de archivos */

if (localAbsoluteFilePath!=null && localAbsoluteFilePath!="") { 

    Intent shareIntent = new Intent(Intent.ACTION_SEND); 
    Uri phototUri = Uri.parse(localAbsoluteFilePath); 

    File file = new File(phototUri.getPath()); 

    Log.d("file path: " +file.getPath(), TAG); 

    if(file.exists()) { 
     // file create success 

    } else { 
     // file create fail 
    } 
    shareIntent.setData(phototUri); 
    shareIntent.setType("image/png"); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri); 
    activity.startActivityForResult(Intent.createChooser(shareIntent, "Share Via"), Navigator.REQUEST_SHARE_ACTION); 
} 

/* función de ahorro de imagen */

private String saveImageLocally(Bitmap _bitmap) { 

     File outputDir = Utils.getAlbumStorageDir(Environment.DIRECTORY_DOWNLOADS); 
     File outputFile = null; 
     try { 
      outputFile = File.createTempFile("tmp", ".png", outputDir); 
     } catch (IOException e1) { 
      // handle exception 
     } 

     try { 
      FileOutputStream out = new FileOutputStream(outputFile); 
      _bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); 
      out.close(); 

     } catch (Exception e) { 
      // handle exception 
     } 

     return outputFile.getAbsolutePath(); 
    } 

/* PASO 3: Manejar el resultado del intento de compartir el archivo. Necesidad de archivo temporal remoto, etc */

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

      // deal with this with whatever constant you use. i have a navigator object to handle my navigation so it also holds all mys constants for intents 
     if (requestCode== Navigator.REQUEST_SHARE_ACTION) { 
      // delete temp file 
      File file = new File (localAbsoluteFilePath); 
      file.delete(); 

      Toaster toast = new Toaster(activity); 
      toast.popBurntToast("Successfully shared"); 
     } 


    } 

/* * UTILS/

public class Utils { 
    //... 
    public static File getAlbumStorageDir(String albumName) { 

     // Get the directory for the user's public pictures directory. 
     File file = 
      new File(Environment.getExternalStorageDirectory(), albumName); 
     if (!file.mkdirs()) { 
      Log.e(TAG, "Directory not created"); 
     } 
     return file; 
    } 
    //... 
} 

Espero que ayude a alguien.

+0

Me estoy equivocando en el paso 2 (¿Qué es utils?): Archivo outputDir = Utils.getAlbumStorageDir (Environment.DIRECTORY_DOWNLOADS); –

+0

@DinIslamMilon, perdón por eso, ha pasado un tiempo desde que trabajé en esto. He agregado la clase estática de utilities personalizada que uso. obtiene el directorio de fotos de los usuarios – wired00

Cuestiones relacionadas