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.
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
oh ok grazie @AlbeyAmakiir! Notato per i post futuri! – dabious