android 相机闪光灯和手电筒的使用

  在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:

扫描二维码关注公众号,回复: 1438586 查看本文章

<?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" />

结尾给出素材,仅供参考,如有雷同,纯属巧合。



猜你喜欢

转载自blog.csdn.net/fahaia/article/details/79092297