【发布时间】:2014-10-05 11:58:49
【问题描述】:
在我的应用程序的一个要求中,我需要弹出一个包含前置摄像头预览的活动,同时我还需要打开手电筒。但是我观察到,我能够打开手电筒和后置摄像头,但不是前置摄像头和手电筒。以下是我的代码:
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);
}
}
}
清单
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.front" />
<permission android:name="android.permission.FLASHLIGHT" />
如何同时打开手电筒和前置摄像头?任何帮助将不胜感激!
【问题讨论】:
-
@MicheleLaFerla:我相信他们在这里使用'camera = Camera.open();',默认情况下会打开后置摄像头。我需要使用前置摄像头。此外,我观察到使用前置凸轮对象创建的参数不能帮助我打开/关闭手电筒
-
如果我按照您的要求,我的理解是您只需要打开手电筒:“理想情况下,如果我们可以在不使用任何相机对象的情况下操作手电筒的任何解决方案都是最好的。”如果我错了,请纠正我。这似乎是您正在寻找的:stackoverflow.com/questions/6068803/…
-
@SurendraKumar:谢谢你的建议。首先,我不仅需要打开手电筒,同时我希望能够同时使用前置摄像头。其次,所有解决方案IV到目前为止看到使用后置摄像头对象来操作手电筒(我不明白为什么 android 将手电筒与摄像头对象绑定/限制使用:/)。
-
@SurendraKumar:第三,您是否注意到您建议的链接中的所有解决方案都在使用手电筒之前使用 camera.open() ?此步骤默认打开后置摄像头。如果我尝试使用前置摄像头对象来使用手电筒,则手电筒不会打开/关闭。似乎 android 已将手电筒“绑定”为仅使用后置摄像头对象参数进行操作。
标签: java android camera flashlight front-camera