2014-04-14 14 views
16

Sto usando una vista personalizzata e in quello sto usando una tela in cui un utente può disegnare qualsiasi cosa e dopo che voglio salvare quell'immagine in sd card bt non era in grado di farlo. Non so cosa sta succedendo.MediaStore.Images.Media.insertImage restituisce null quando si tenta di salvare l'immagine

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

Ecco i dettagli dell'errore

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) 

Sono sempre ottenendo questo messaggio durante il tentativo di salvare l'immagine .... "Oops! Immagine non può essere salvato." .....

+0

aventi lo stesso problema su Android 4.4.2 SM-P601. Il metodo di inserimento dell'immagine fallisce sempre. con la stessa eccezione. –

risposta

6

Una risposta in ritardo po ', ma ancora ...

Non sai quale è la linea 238, ma probabilmente il motivo è qui:

String imgSaved = MediaStore.Images.Media.insertImage ( getContentResolver(), drawView.getDrawingCache(), UUID.randomUUID() toString() + "png.", "Esempio".);

Poiché il metodo si trova in un click listener, getContentResolver potrebbe restituire un Resolver diverso da quello dell'applicazione. O salvare un riferimento privato al resolver contenuti, oppure si potrebbe provare a sostituire getContentResolver con MainActivity.this.getContentResolver():

String = imgSaved MediaStore.Images.Media.insertImage ( MainActivity.this.getContentResolver(), drawView.getDrawingCache (), UUID.randomUUID(). ToString() + ".png", "disegno");

In alternativa, potrebbe essere un problema di autorizzazione. Assicurarsi che nel manifesto si dispone:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Una nota finale, il risultato di insertImage è un URI, imgSaved non è il nome migliore per quella variabile :)

+0

Grazie, il tuo commento mi ha aiutato. Ho creato un contenuto ContentResolver privatoResolver come campo nel mio adattatore, sull'inizializzazione che ho allegato getContext(). GetContentResolver(); ad esso e quando si fa insertImage ho usato il contentResolver. – lxknvlk

+6

Non funziona per me! Android 4.4.2 qui – gogonapel

24

ho avuto questo problema nell'emulatore (Android 4.4) e risulta che è dovuto a un Android bug, dove accade quando l'utente non ha ancora fatto una foto sul dispositivo (cioè la galleria è vuota e non è stata inizializzata). La soluzione alternativa è inizializzare manualmente la directory delle foto:

void fixMediaDir() { 
    File sdcard = Environment.getExternalStorageDirectory(); 
    if (sdcard != null) { 
     File mediaDir = new File(sdcard, "DCIM/Camera"); 
     if (!mediaDir.exists()) { 
      mediaDir.mkdirs(); 
     } 
    } 
} 

Non sono sicuro se è stato risolto nelle versioni successive di Android.

+1

ha funzionato per me, grazie! –

+1

Sì. Come questo commento È vero. – mghhgm