2012-06-30 4 views
23

Sto tentando di salvare una bitmap in un file e uno specifico utilizzando direttamente una funzione che ho creato. La sua non funziona. Si blocca dopo la parte di bitmap.compress (prima di qui3). logSalvare la funzione bitmap su file

File dir = new File(filepath); 

    if(!dir.exists())dir.mkdirs(); 

    File file = new File(Environment.getExternalStorageDirectory() + filepath, side + ".png"); 
    FileOutputStream fOut = new FileOutputStream(file); 

    bitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut); 
    fOut.flush(); 
    fOut.close(); 

    System.out.println(filepath); 

    bitmap.recycle(); 
    System.gc(); 

Errore:

06-29 00:16:38.089: D/AndroidRuntime(3260): Shutting down VM 
06-29 00:16:38.089: W/dalvikvm(3260): threadid=1: thread exiting with uncaught exception (group=0xb587f4f0) 
06-29 00:16:38.089: E/AndroidRuntime(3260): FATAL EXCEPTION: main 
06-29 00:16:38.089: E/AndroidRuntime(3260): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { act=android.intent.action.VIEW dat=content://org.openintents.filemanager/mimetype//mnt/sdcard/download/02977_awreckedboatintheocean_1280x1024.jpg }} to activity {com.polygonattraction.testbirds/com.polygonattraction.testbirds.functions.SelectImageSource}: java.lang.IllegalStateException: Can't compress a recycled bitmap 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.access$2000(ActivityThread.java:117) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.os.Looper.loop(Looper.java:130) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at dalvik.system.NativeStart.main(Native Method) 
06-29 00:16:38.089: E/AndroidRuntime(3260): Caused by: java.lang.IllegalStateException: Can't compress a recycled bitmap 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.graphics.Bitmap.checkRecycled(Bitmap.java:180) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.graphics.Bitmap.compress(Bitmap.java:581) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at com.polygonattraction.testbirds.functions.Functions.SaveToFile(Functions.java:144) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at com.polygonattraction.testbirds.functions.SelectImageSource.onActivityResult(SelectImageSource.java:113) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.Activity.dispatchActivityResult(Activity.java:3908) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2528) 
+1

che cosa è la vostra uscita logcat? –

+0

"Impossibile comprimere una bitmap riciclata.". Hai chiamato bitmap.recycle(); qualsiasi dove prima di questo? –

+0

L'ho chiamato solo dopo averlo salvato, ho provato a rimuoverlo ma ho ancora lo stesso errore. –

risposta

64
  1. È bisogno di un permesso appropriato in manifest.xml:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    
  2. out.flush() controllo il out non è nu ll ..

  3. String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + 
              "/PhysicsSketchpad"; 
    File dir = new File(file_path); 
    if(!dir.exists()) 
        dir.mkdirs(); 
    File file = new File(dir, "sketchpad" + pad.t_id + ".png"); 
    FileOutputStream fOut = new FileOutputStream(file); 
    
    bmp.compress(Bitmap.CompressFormat.PNG, 85, fOut); 
    fOut.flush(); 
    fOut.close(); 
    
+0

sì ............ –

+0

scusa non capisco, vuoi scrivere file se non esiste solo? –

+0

"si blocca" Si prega di fornire il registro cat di crash ... –

11

penso che questo è la risposta molto meglio.

due esempi funzionano per me, come riferimento.

Bitmap bitmap = Utils.decodeBase64(base64); 
    try{ 
     File file = new File(filePath); 
     FileOutputStream fOut = new FileOutputStream(file); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut); 
     fOut.flush(); 
     fOut.close();} 
    catch (Exception e) { 
     e.printStackTrace(); 
     LOG.i(null, "Save file error!"); 
     return false; 
} 

e questo

Bitmap savePic = Utils.decodeBase64(base64); 
    File file = new File(filePath); 
    File path = new File(file.getParent()); 

    if (savePic != null) { 
     try { 
      // build directory 
      if (file.getParent() != null && !path.isDirectory()) { 
       path.mkdirs(); 
      } 
      // output image to file 
      FileOutputStream fos = new FileOutputStream(filePath); 
      savePic.compress(Bitmap.CompressFormat.PNG, 90, fos); 
      fos.close(); 
      ret = true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } else { 
     LOG.i(TAG, "savePicture image parsing error"); 
    } 

penso che questo è la risposta molto meglio.

4

Ecco la funzione che vi aiutano

private void saveBitmap(Bitmap bitmap,String path){ 
     if(bitmap!=null){ 
      try { 
       FileOutputStream outputStream = null; 
       try { 
        outputStream = new FileOutputStream(path); //here is set your file path where you want to save or also here you can set file object directly 

        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); // bitmap is your Bitmap instance, if you want to compress it you can compress reduce percentage 
        // PNG is a lossless format, the compression factor (100) is ignored 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        try { 
         if (outputStream != null) { 
          outputStream.close(); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      }  
     } 
    }