2012-06-30 16 views
23

Estoy tratando de guardar un mapa de bits en un archivo y un específico directamente usando una función que he creado. No funciona. Se bloquea después de la parte de bitmap.compress (antes de aquí3). registroGuardar la función de mapa de bits a archivo

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

error:

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

cuál es su salida Logcat? –

+0

"No se puede comprimir un mapa de bits reciclado". ¿Ha llamado a bitmap.recycle(); en cualquier lugar antes de esto? –

+0

Lo he llamado solo después de que se supone que lo ha guardado, intenté eliminarlo pero sigo teniendo el mismo error. –

Respuesta

64
  1. Hace falta un permiso apropiado en manifest.xml:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    
  2. out.flush() verificación de la out no es 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

lo siento no obtener, ¿desea escribir el archivo si no existe solo? –

+0

"se bloquea" Proporcione el registro de cat de bloqueo ... –

11

creo que esto es mucho mejor respuesta.

dos ejemplos funcionan para mí, para su referencia.

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

y éste

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

creo que esto es mucho mejor respuesta.

4

Aquí es la función que le ayude

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