android canvas android-sdcard mediastore

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 :)