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.
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
oh ok gracias @AlbeyAmakiir! ¡Tomado en cuenta para publicaciones futuras! – dabious