在android项目中单独使用手电筒或者闪光灯是没有任何问题的。但是在你相机camera打开的时候再打开手电筒功能这时候就或多或少有问题。会报类似于这种错Fail to connect to camera service。下面给出解决方法。
一 。因为最近在做一个类似于共享单车这种的项目,利用Zxing SDK 打开相机扫描,来识别二维码或者条形码的功能。项目需要把手电筒或者闪光灯加进去。用户可以选择打开或者关闭。自己先从网上找了打开手电筒的方法,各种方法各种加,都会报Fail to connect to camera service。网上查了下解决方法。找到如下结果。
1.手机上有安装安全过滤软件。因为camera属于较为敏感的权限,所以,有些手机安全管家会自动拒绝camera的打开操作。
针对这种错误,可以在手机安全管家软件中,降低一下camera的安全级别,或把自己的APP添加到白名单中。
2.AndroidManifest.xml中没有添加camera的权限申请,对策则是添加<uses-permission android:name="android.permission.CAMERA"/>权限申请。
3.之前对camera打开后,并没有释放掉。
解决对策就是调用下面的处理
camera.stopPreview();
camera.release();
camera = null;
4.内存占用过多,可能导致了自己应用可分配的内存不足了。
这个场景的错误差不多是在自己的应用中打开摄像头,对摄像头取得的每一帧数据都进行额外的处理,随着处理次数的增加,如果有没被及时销毁的对象存在,则就极有可能会导致本文开头出现的异常了。
针对此种问题,解决的方法就是仔细检查下临时创建的对象是否都已经释放掉。
2和3这两个排除掉,自己都加了,1和4没试过。所以找了一个方法可以解决。在Zxing中的.Zxing.camera 包下的CameraManager类中,加入打开和关闭闪光灯的方法,然后在使用的地方直接调用flashHandler()就可以了。
public void flashHandler() {
//camera.startPreview();
Parameters parameters = camera.getParameters();
// 判断闪光灯当前状态來修改
if (Parameters.FLASH_MODE_OFF.equals(parameters.getFlashMode())) {
turnOn(parameters);
} else if (Parameters.FLASH_MODE_TORCH.equals(parameters.getFlashMode())) {
turnOff(parameters);
}
}
//開
private void turnOn(Parameters parameters) {
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
}
//關
private void turnOff(Parameters parameters) {
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
}
-----------------------------------------------------------------------------------------
布局使用:
<ToggleButton android:id="@+id/toggleButton1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:turnOff="关灯"
android:turnOn="开灯"
android:text="ToggleButton"/>
注:Togglebutton控件是一个开关按钮。
二 。单独使用手电筒功能
toggleButton = (ToggleButton) this.findViewById(R.id.toggleButton1);
toggleButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!toggleButton.isChecked()) {
PackageManager pm = this.getPackageManager();
FeatureInfo[] features = pm.getSystemAvailableFeatures();
for (FeatureInfo f : features) {
if (PackageManager.FEATURE_CAMERA_FLASH.equals(f.name)) // 判断设备是否支持闪光灯
{
if (null == m_Camera) {
m_Camera = Camera.open();
}
Camera.Parameters parameters = m_Camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
m_Camera.setParameters(parameters);
m_Camera.startPreview();
toggleButton.setBackgroundColor(0x30ffffff);
}
}
} else {
if (m_Camera != null) {
m_Camera.stopPreview();
m_Camera.release();
m_Camera = null;
}
toggleButton.setBackgroundColor(0xffffffff);
}
}
});
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ToggleButton android:id="@+id/toggleButton1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:text="ToggleButton"
android:longClickable="false" />
</LinearLayout>
权限:
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.autofocus" />
结尾给出素材,仅供参考,如有雷同,纯属巧合。