Below is the code for the custom camera application I'm working on. Everthing works just fine, except when shooting images with flash. When the flash is on, the preview showed the user that the image looks correct, but the image stored on the SD card is very dark (with only white objects visible) and often just black. I tried to find out the problem for several days. Any ideas what could happen?
public class CustomCamera extends Activity implements SurfaceHolder.Callback{ Camera camera; Surfaceview surfaceView; SurfaceHolder surfaceHolder; boolean previewing = false; LayoutInflater controlInflater = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); getWindow().setFormat(PixelFormat.UNKNOWN); surfaceView = (SurfaceView)findViewById(R.id.camerapreview); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); ... } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if(previewing){ camera.stopPreview(); previewing = false; } if (camera != null){ try { Camera.Parameters parameters = camera.getParameters(); camera.setDisplayOrientation(90); determineDisplayOrientation(); camera.setPreviewDisplay(surfaceHolder); previewing = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ List<String> supportedFocusModes = parameters.getSupportedFocusModes(); if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){ parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); } else{ parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); } } if (parameters.getSupportedWhiteBalance().contains( Parameters.WHITE_BALANCE_AUTO)) { parameters.setWhiteBalance(Parameters.WHITE_BALANCE_AUTO); } if (parameters.getSupportedSceneModes().contains( Parameters.SCENE_MODE_AUTO)) { parameters.setSceneMode(Parameters.SCENE_MODE_AUTO); } camera.setParameters(parameters); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceCreated(SurfaceHolder holder) { flashButton.setBackgroundResource(R.drawable.auto_flash); camera = Camera.open(CURRENT_CAMERA_ID); Camera.Parameters camParameters = camera.getParameters(); flashSupported = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); if ( flashSupported){ camParameters.setFlashMode(Parameters.FLASH_MODE_AUTO); lastFlashMode = AUTO_FLASH; camera.setParameters(camParameters); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); camera = null; previewing = false; }
}
And here is the class that saves the image
public class ImageSaver{ private Context context; private String NameOfFolder = "/ProjectFolder"; String fileName; String file_path; public void saveImage(Context context,Bitmap ImageToSave){ context = context; file_path = Environment.getExternalStorageDirectory().getAbsolutePath()+ NameOfFolder; String CurrentDateAndTime= getCurrentDateAndTime(); File dir = new File(file_path); if(!dir.exists()){ dir.mkdirs(); } fileName = CurrentDateAndTime+ ".jpg"; File file = new File(dir, fileName); try { FileOutputStream fOut = new FileOutputStream(file); ImageToSave.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
}
Thanks a lot!
source share