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:

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

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



  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要实现Android相机的外挂闪光灯和拍照同步,你可以按照以下步骤进行操作: 1. 首先,确保在AndroidManifest.xml文件中添加相机闪光灯的权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera.flash" /> ``` 2. 在你的Activity或Fragment中,创建相机实例并打开相机: ```java private Camera camera; private void openCamera() { camera = Camera.open(); } ``` 3. 获取相机参数,并设置外部闪光灯模式: ```java private void setExternalFlashMode(boolean enable) { Camera.Parameters parameters = camera.getParameters(); if (enable) { parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); } else { parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); } camera.setParameters(parameters); } ``` 4. 在拍照时,打开外部闪光灯,等待闪光灯亮起后再进行拍照: ```java private void takePhotoWithExternalFlash() { setExternalFlashMode(true); // 等待闪光灯亮起 try { Thread.sleep(1000); // 根据实际情况调整等待时间 } catch (InterruptedException e) { e.printStackTrace(); } camera.takePicture(null, null, pictureCallback); } ``` 5. 在拍照完成后,关闭外部闪光灯: ```java private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 处理拍照结果 setExternalFlashMode(false); } }; ``` 这样,当调用 `takePhotoWithExternalFlash()` 方法时,相机会先打开外部闪光灯,并等待闪光灯亮起后再进行拍照,拍照完成后关闭外部闪光灯。你可以根据实际需求调整等待时间和闪光灯的模式。 注意:外挂闪光灯的连接方式可能因设备而异,你需要根据具体的硬件连接方式和通信协议来控制外部闪光灯的开关。以上代码仅提供了闪光灯模式的设置示例,具体的外部闪光灯控制需要根据硬件设备的要求进行编码。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值