0

Я пытаюсь получить RGB из растрового изображения и сохранить JPEG изображение в то же время, когда JPEG байтовый массив доступен из ByteBuffer в андроида Camera2 апи здесь мой код:Выдавать нулевую ссылку на объект fileoutputstream.close?

private class ImageSaver implements Runnable { 
private final Image mImage; 
private ImageSaver(Image image) { 
    mImage = image; 
} 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer(); 
    byte[] bytes = new byte[byteBuffer.remaining()]; 
    byteBuffer.get(bytes); 
    final byte[] myBytes = bytes; 
    Thread getRGB = new Thread() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      super.run(); 
      Bitmap bmp = BitmapFactory.decodeByteArray(myBytes, 0, myBytes.length); 
      for(int y=0; y<bmp.getHeight();y++) { 
       for(int x=0; x<bmp.getWidth();x++) { 
        int c = bmp.getPixel(x, y); 
        pixel++; 
        red += Color.red(c); 
        green += Color.green(c); 
        blue += Color.blue(c); 
       } 
      } 
     }   
    }; 
    getRGB.start(); 
    FileOutputStream fileOutputStream = null; 
    try { 
     fileOutputStream = new FileOutputStream(mImageFile); 
     fileOutputStream.write(bytes); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     mImage.close(); 
     if(fileOutputStream!=null) 
     { 
      try {      
       fileOutputStream.close();      
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }  
} 

здесь исключения теперь я получение

03-13 19: 26: 26,199: E/AndroidRuntime (19715): FATAL ИСКЛЮЧЕНИЕ: Мой Camera2 Basic App 03-13 19: 26: 26,199: E/AndroidRuntime (19715): Процесс: ком .example.mycamera2basicapp, PID: 19715 03-13 19: 26: 26.199: E/AndroidRuntime (19715): java.lang.NullPointerException: file == null 03-13 19: 26: 26.199: E/AndroidRuntime (19715): at java.io.FileOutputStream. (FileOutputStream.java:84) 03-13 19: 26: 26.199: E/AndroidRuntime (19715): в java .io.FileOutputStream. (FileOutputStream.java:72) 03-13 19: 26: 26.199: E/AndroidRuntime (19715): at com.example.mycamera2basicapp.MainActivity $ ImageSaver.run (MainActivity.java:145) 03 -13 19: 26: 26.199: E/AndroidRuntime (19715): at android.os.Handler.handleCallback (Handler.java:739) 03-13 19: 26: 26.199: E/AndroidRuntime (19715): у android. os.Handler.dispatchMessage (Handler.java:95) 03-13 19: 26: 26.199: E/AndroidRuntime (19715): at android.os.Looper.loop (Looper.java:211) 03-13 19: 26: 26.199: E/AndroidRuntime (19715): at android.os.HandlerThread.run (HandlerThread.java:61)

здесь, где я инициализация mImageFile:

@Override 
      public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, 
        long frameNumber) { 
       // TODO Auto-generated method stub 
       super.onCaptureStarted(session, request, timestamp, frameNumber); 
       createImageGallery(); 
       try { 
        mImageFile = createImageFile(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

и createImageFile() является простой функцией, которая создает файл JPEG:

private File createImageFile() throws IOException { 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "Jpeg_Image_"+timeStamp+"_"; 
    File image = File.createTempFile(imageFileName, ".jpg", mJpegGalleryFolder); 
    mImageFileLocation = image.getAbsolutePath(); 
    return image; 
} 

, когда я комментирую линию

pixel++; 
red += Color.red(c); 
green += Color.green(c); 
blue += Color.blue(c); 

файл сохраняется без ошибок. Мое намерение - получить RGB и сохранить изображение в то же время, может кто-то помочь мне в решении этой проблемы или показать мне другое направление, где я могу сохранить изображение и использовать RGB тоже.

+0

Ну, очевидно, первый блок улов был введен, так 'fileOutputStream' равно нулю. Это легко разрешимо с проверкой if null, прежде чем вы закроете свои ресурсы. –

+0

теперь мне это java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.hardware.camera2.CaptureRequest $ Builder android.hardware.camera2.CameraDevice. createCaptureRequest (int) 'на ссылке нулевого объекта –

+0

как вы определили mImageFile? вызывает вызов fileOutputStream = new FileOutputStream (mImageFile); создает экземпляр fileOutputStream? – harshitpthk

ответ

0

Положите вызовы на close в условные обозначения, например.

if (fileOutputStream != null) { 
    try { 
    fileOutputStream.close(); 
    } catch (IOException e) { 
    // ... 
    } 
} 

Предполагая, что вы используете Java 7 (или более позднюю версию), вы должны использовать вместо этого try-with-resources.

0

В дополнение к ответу Энди, я хотел бы использовать этот служебный класс для него:

public class CloseUtils { 

public static void close(AutoCloseable ...autoCloseables) throws Exception { 

    Exception firstException = null; 

    for (AutoCloseable autoCloseable : autoCloseables) { 

     try { 
      if (null != autoCloseable) { 
       autoCloseable.close(); 
      } // if 
     } catch (Exception e) { 

      if (null == firstException) { 
       firstException = e; 
      } else { 
       firstException.addSuppressed(e); 
      } // else 
     } // catch 
    } // for 

    if (null != firstException) { 
     throw firstException; 
    } // if 
} //() 

public static Exception closeQuietly(AutoCloseable ...autoCloseables) { 
    try { 
     close(autoCloseables); 
     return null; 
    } catch (Exception e) { 
     return e; 
    } // catch 
} //() 


} // class