android - MediaStore.Images.Media.insertImage devuelve un valor nulo al intentar guardar la imagen
canvas android-sdcard (2)
Estoy usando una vista personalizada y en eso estoy usando un lienzo en el que un usuario puede dibujar cualquier cosa y después de eso quiero guardar esa imagen en la tarjeta SD bt no pude hacerlo. No sé qué está pasando.
else if(view.getId()==R.id.save_btn){
//save drawing
AlertDialog.Builder saveDialog = new AlertDialog.Builder(this);
saveDialog.setTitle("Save drawing");
saveDialog.setMessage("Save drawing to device Gallery?");
saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
private FileOutputStream fOut;
public void onClick(DialogInterface dialog, int which){
//save drawing
drawView.setDrawingCacheEnabled(true);
//attempt to save
String imgSaved = MediaStore.Images.Media.insertImage(
getContentResolver(), drawView.getDrawingCache(),
UUID.randomUUID().toString()+".png", "drawing");
//feedback
if(imgSaved!=null){
Toast savedToast = Toast.makeText(getApplicationContext(),
"Drawing saved to Gallery!", Toast.LENGTH_SHORT);
savedToast.show();
}
else{
Toast unsavedToast = Toast.makeText(getApplicationContext(),
"Oops! Image could not be saved.", Toast.LENGTH_SHORT);
unsavedToast.show();
}
drawView.destroyDrawingCache();
}
});
saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
dialog.cancel();
}
});
saveDialog.show();
}
AQUÍ ESTÁN LOS DETALLES DE ERRORES
04-14 11:24:28.700: E/MediaStore(6866): Failed to insert image
04-14 11:24:28.700: E/MediaStore(6866): java.io.FileNotFoundException: No such file or directory
04-14 11:24:28.700: E/MediaStore(6866): at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
04-14 11:24:28.700: E/MediaStore(6866): at android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:577)
04-14 11:24:28.700: E/MediaStore(6866): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:673)
04-14 11:24:28.700: E/MediaStore(6866): at android.content.ContentResolver.openOutputStream(ContentResolver.java:537)
04-14 11:24:28.700: E/MediaStore(6866): at android.content.ContentResolver.openOutputStream(ContentResolver.java:513)
04-14 11:24:28.700: E/MediaStore(6866): at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:891)
04-14 11:24:28.700: E/MediaStore(6866): at com.example.clent.MainActivity$9.onClick(MainActivity.java:238)
04-14 11:24:28.700: E/MediaStore(6866): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
04-14 11:24:28.700: E/MediaStore(6866): at android.os.Handler.dispatchMessage(Handler.java:99)
04-14 11:24:28.700: E/MediaStore(6866): at android.os.Looper.loop(Looper.java:137)
04-14 11:24:28.700: E/MediaStore(6866): at android.app.ActivityThread.main(ActivityThread.java:5103)
04-14 11:24:28.700: E/MediaStore(6866): at java.lang.reflect.Method.invokeNative(Native Method)
04-14 11:24:28.700: E/MediaStore(6866): at java.lang.reflect.Method.invoke(Method.java:525)
04-14 11:24:28.700: E/MediaStore(6866): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
04-14 11:24:28.700: E/MediaStore(6866): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-14 11:24:28.700: E/MediaStore(6866): at dalvik.system.NativeStart.main(Native Method)
Siempre recibo este mensaje al intentar guardar la imagen ... "¡Ups! La imagen no se pudo guardar." .....
Tuve este problema en el Emulador (Android 4.4) y resulta que se debe a un error de Android , que ocurre cuando el usuario no ha tomado una foto en el dispositivo anteriormente (es decir, la galería está vacía y no se ha inicializado). . La solución es inicializar el directorio de fotos manualmente:
void fixMediaDir() {
File sdcard = Environment.getExternalStorageDirectory();
if (sdcard != null) {
File mediaDir = new File(sdcard, "DCIM/Camera");
if (!mediaDir.exists()) {
mediaDir.mkdirs();
}
}
}
No estoy seguro si esto se soluciona en versiones posteriores de Android.
Una respuesta un poco tarde, pero aún así ...
No estoy seguro de cuál es la línea 238, pero probablemente la razón está aquí:
String imgSaved = MediaStore.Images.Media.insertImage (getContentResolver (), drawView.getDrawingCache (), UUID.randomUUID (). ToString () + ". Png", "drawing");
Dado que el método se encuentra dentro de un detector de getContentResolver
, getContentResolver
puede devolver un Resolver diferente al de la aplicación. Guarde una referencia privada a la resolución de contenido o intente reemplazar getContentResolver
con MainActivity.this.getContentResolver()
:
String imgSaved = MediaStore.Images.Media.insertImage (MainActivity.this.getContentResolver (), drawView.getDrawingCache (), UUID.randomUUID (). ToString () + ".png", "drawing");
Alternativamente, podría ser un problema de permisos. Asegúrate en el manifiesto que tienes:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Una nota final, el resultado de insertImage
es un URI, imgSaved
no es el mejor nombre para esa variable :)