如何在android中同时打开手电筒和前置摄像头

在我的应用程序的一个要求中,我需要弹出一个包含前置摄像头预览的活动,同时我也需要打开手电筒。但是我观察到,我可以打开手电筒并返回相机,但没有前置摄像头和手电筒在一起。以下是我的代码:

public class Cam extends Activity { private static int cameraId = 0; private Camera camera; //Adding for camera preview public static FrameLayout preview; public static CameraPreview mPreview; Context context; ImageButton btnSwitch; private boolean isFlashOn; private boolean hasFlash; Parameters params; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("Cam","Inside onCreate"); setContentView(R.layout.cam); context = getApplicationContext(); btnSwitch = (ImageButton) findViewById(R.id.btnSwitch); hasFlash = getApplicationContext().getPackageManager() .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); startCamera(); // displaying button image toggleButtonImage(); btnSwitch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isFlashOn) { turnOffFlash(); } else { turnOnFlash(); } } }); } @Override protected void onPause() { super.onPause(); turnOffFlash(); Log.e("Cam","Inside onPause"); try { if (camera != null) { camera.release(); camera = null; preview.removeView(mPreview); } } catch (Exception e) { e.printStackTrace(); } } @Override protected void onResume() { super.onResume(); Log.e("Cam","Inside onResume"); try { if(camera ==null) { Log.d("Cam","in resume,camera is null"); try { camera = android.hardware.Camera.open(cameraId); //opens front cam // camera = Camera.open(); when I use this I can on/off the flashlight,since I am using the back camera. mPreview = new CameraPreview(this, camera); preview = (FrameLayout) findViewById(R.id.camera_preview); preview.addView(mPreview); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); Log.e("Cam","Inside onDestroy"); if (camera != null) { try { camera.release(); camera = null; preview.removeView(mPreview); } catch (Exception e) { e.printStackTrace(); } } } private void startCamera() { Log.e("Cam","Inside doInBackground"); String msg = ""; // Do we have a camera? try { if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { } else { cameraId = AppFunctions.findFrontFacingCamera();//A function that returns 0 for front camera if (cameraId < 0) { } else { try { camera = Camera.open(cameraId);//opens front cam // camera = Camera.open(); when I use this I can on/off the flashlight,since I am calling the back camera. params = camera.getParameters(); Log.e("Cam","camera id" + cameraId); Log.e("Cam","params" + params); } catch (Exception e) { e.printStackTrace(); } try { mPreview = new CameraPreview(getApplicationContext(), camera); preview = (FrameLayout) findViewById(R.id.camera_preview); preview.addView(mPreview); } catch (Exception e) { e.printStackTrace(); } } } } catch (Exception e3) { e3.printStackTrace(); } } private void turnOnFlash() { Log.v("Cam","Inside turnOnFlash"); if (!isFlashOn) { if (camera == null || params == null) { Log.v("Cam","camera or param is null"); return; } params.setFlashMode(Parameters.FLASH_MODE_TORCH); camera.setParameters(params); camera.startPreview(); isFlashOn = true; // changing button/switch image toggleButtonImage(); } } /* * Turning Off flash */ private void turnOffFlash() { Log.v("Cam","Inside turnOffFlash"); if (isFlashOn) { if (camera == null || params == null) { Log.v("Cam","camera or param is null"); return; } params.setFlashMode(Parameters.FLASH_MODE_OFF); camera.setParameters(params); camera.stopPreview(); isFlashOn = false; // changing button/switch image toggleButtonImage(); } } private void toggleButtonImage(){ if(isFlashOn){ btnSwitch.setImageResource(R.drawable.btn_switch_on); }else{ btnSwitch.setImageResource(R.drawable.btn_switch_off); } } } 

表现

     

如何同时打开手电筒和前凸轮? 任何帮助,将不胜感激 !

尝试在后台打开手电筒,然后打开前置摄像头。 实际上你可以在后台转动前置摄像头和手电筒。

这里如何在后台打开手电筒: 这个

这里如何在背景中打开相机: 这个

手电筒

  public void onToggleClicked(View view) { PackageManager pm = context.getPackageManager(); final Parameters p = camera.getParameters(); if (isFlashSupported(pm)) { boolean on = ((ToggleButton) view).isChecked(); if (on) { Log.i("info", "torch is turn on!"); p.setFlashMode(Parameters.FLASH_MODE_TORCH); camera.setParameters(p); camera.startPreview(); } else { Log.i("info", "torch is turn off!"); p.setFlashMode(Parameters.FLASH_MODE_OFF); camera.setParameters(p); camera.stopPreview(); } 

相机:

  ImageButton ib = (ImageButton) findViewById(R.id.buttonToast); ib.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(i, CAPTURE_IMAGE_CAPTURE_CODE); } }); 

以下代码检查前置摄像头的可用性:

 private Camera openFrontFacingCameraGingerbread() { int cameraCount = 0; Camera cam = null; Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); cameraCount = Camera.getNumberOfCameras(); for (int camIdx = 0; camIdx < cameraCount; camIdx++) { Camera.getCameraInfo(camIdx, cameraInfo); if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { try { cam = Camera.open(camIdx); } catch (RuntimeException e) { Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage()); } } } return cam; } 

然后在AndroidManifest.xml文件中添加以下权限:

    

注意:此function在Gingerbread(2.3)和Up Android版本中可用。

我建议使用此示例中的surfaceView来实现工作手电筒。

希望这可以帮助 :)