2011-11-24 33 views
10

Ho un ImageView con un intento di condivisione (che funziona alla grande, visualizza tutte le app con cui posso condividere l'immagine), tuttavia, non posso condividere la foto perché non ha alcun percorso sul mio telefono. Come faccio a salvare ImageView sul mio telefono? Di seguito è il mio codice.Come si salva un ImageView come immagine?

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

} 
} 

UPDATE Ok, così ho capito. Ora ho una nuova domanda, come farei per salvare questa immagine in una nuova cartella?

+0

Una nuova domanda dovrebbe essere fatta separatamente, in quanto non è possibile assegnare più risposte per una singola domanda. Tuttavia, File ha un metodo mkdirs() che può essere utilizzato per garantire che la cartella specificata esista. – AlbeyAmakiir

+0

oh ok grazie @AlbeyAmakiir! Notato per i post futuri! – dabious

risposta

4

Durante il salvataggio e il caricamento, è necessario innanzitutto ottenere il percorso root del sistema. Questo è come lo farei.

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

L'ho aggiunto ma non funziona ancora ... alcuni suggerimenti? – dabious

+0

funziona ora! Grazie mille!! – dabious

+2

@dabious puoi condividere la soluzione di lavoro. – User404

1

Mi sono imbattuto in un paio di soluzioni che non risolvono questo problema.

Ecco una soluzione che ha funzionato per me. Una Gotcha è il necessario per memorizzare le immagini in una non applicazione luogo privato o in comune (http://developer.android.com/guide/topics/data/data-storage.html#InternalCache)

Molti suggerimenti dicono da memorizzare nella posizione "privato" cache Apps, ma questo ovviamente non e 'possibile tramite altre applicazioni esterne, tra cui l'intento generico del file di condivisione che viene utilizzato. Quando lo provi, verrà eseguito ma ad esempio dropbox ti dirà che il file non è più disponibile.

/* PASSO 1 - Salvare il file bitmap localmente utilizzando la funzione di salvataggio file di seguito. */

localAbsoluteFilePath = saveImageLocally(bitmapImage); 

/* FASE 2 - Condividere il percorso del file assoluto non privato alla condivisione file intento */

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

/* Salva Immagine FUNZIONE */

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

/* PASSO 3: gestire il risultato dell'intenzione file di condivisione. Necessità di file remoto temporanei ecc */

@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; 
    } 
    //... 
} 

Mi auguro che aiuta qualcuno.

+0

Mi sto sbagliando a step2 (Che cosa è utils?): File outputDir = Utils.getAlbumStorageDir (Environment.DIRECTORY_DOWNLOADS); –

+0

@DinIslamMilon, mi dispiace, è da un po 'che non ci lavoro su questo. Ho aggiunto la classe statica dei programmi di utilità personalizzati che utilizzo. ottiene la directory delle immagini degli utenti – wired00

Problemi correlati