3

我正在尝试使用 Google Play 服务重新实现 Redlaser 条形码扫描仪。并面对手电筒的问题。Android hardware.Camera对象不能与gms.vision中的CameraSource共同使用。有没有机会使用手电筒和谷歌条形码扫描仪?

4

5 回答 5

4

不确定我是否完全明白你的要求,但我的方法是使用已经创建的 mCamerSource 对象和 setFlashMode() 从那里开始,这对我有用,因为我使用按钮来切换闪光灯。

在你的 onCreate 添加这个或在 createCameraSource 方法中,就像在示例中一样 - >

mCameraSource = builder
            .setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null)
            .build();

然后制作一个切换闪光灯的方法,希望这会有所帮助。

private void ToggleFlash()
{
    fab_flash.startAnimation(spin_it);
    if(currentDrawalbe == FLASH_DEFAULT_STATE)
    {
        fab_flash.setImageResource(FLASH_TOGGLE_STATE);
        currentDrawalbe = FLASH_TOGGLE_STATE;
        mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
    }
    else
    {
        fab_flash.setImageResource(FLASH_DEFAULT_STATE);
        currentDrawalbe = FLASH_DEFAULT_STATE;
        mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
    }
}

currentDrawable 只是闪光灯图标的图像,所以基本上如果图像是打开的闪光灯,则执行 else 子句,否则 if 子句

于 2015-10-18T16:48:45.393 回答
3

问题是相机 API 不支持多次打开相机。打开手电筒和启动 CameraSource 都需要单独调用来打开相机。如果您尝试两者都做,最后请求的那个将失败。

好消息是我们最近开源了 CameraSource 实现。这个新版本包括一个打开手电筒的选项,应该可以解决这个问题。看这里:

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/ CameraSource.java

于 2015-09-18T19:13:04.757 回答
2

我正在使用此代码,它正在成功替换:cameraSource.start(surfaceView.getHolder()); 或 cameraSource.start(); TO setFlash();

经过

import java.lang.reflect.Field;
import android.hardware.Camera;

不要忘记 AndroidManifest:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<permission android:name="android.permission.FLASHLIGHT"
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
    android:protectionLevel="normal"/>

然后添加此方法

 public static Camera getCamera(CameraSource cameraSource) {
    Field[] declaredFields = CameraSource.class.getDeclaredFields();

    for (Field field : declaredFields) {
        if (field.getType() == Camera.class) {
            field.setAccessible(true);
            try {
                Camera camera = (Camera) field.get(cameraSource);
                if (camera != null) {
                    return camera;
                }

                return null;
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

            break;
        }
    }

    return null;
}


public void setFlash () throws IOException {
   getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    cameraSource.start(surfaceView.getHolder());
        Camera _cam = getCamera (cameraSource);
        if (_cam != null) {
            Camera.Parameters _pareMeters = _cam.getParameters();
            _pareMeters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            _cam.setParameters(_pareMeters);
            _cam.startPreview();
        }
}
于 2020-05-28T14:29:52.760 回答
2

目前我正在使用此代码来查找相机对象:

private boolean findCameraObject(){
    if(mCameraSource == null) {
        return false;
    }

    Field[] declaredFields = null;
    try {
        declaredFields = CameraSource.class.getDeclaredFields();
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    if(declaredFields == null) {
        return false;
    }

    for (Field field : declaredFields) {
        if (field.getType() == Camera.class) {
            field.setAccessible(true);
            try {
                Camera camera = (Camera) field.get(this.mCameraSource);
                if (camera != null) {
                    Camera.Parameters params = camera.getParameters();
                    params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
                    camera.setParameters(params);
                    setCamera(camera);
                    return true;
                }

                return false;
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            break;
        }
    }
    return false;
}
于 2015-09-22T15:20:06.983 回答
0
Add permossion on AndroidManifest file 

 <uses-feature android:name="android.hardware.camera" />
 <uses-feature android:name="android.hardware.camera.autofocus" />
 <permission android:name="android.permission.FLASHLIGHT"
        android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
        android:protectionLevel="normal"/>
        
Turn on torch on Android, using Kotlin.

cameraProvider.bindToLifecycle((LifecycleOwner)this,
                 cameraSelector, imageAnalysis, preview);


Get Camera for cameraProvider..

camera = cameraProvider!!.bindToLifecycle(
                    (this as LifecycleOwner),
                    cameraSelector!!, Preview
                )
                
to turn on/off the FlashLight
private fun navigateflash(isFlash : Boolean) {
            try {
               if(camera!= null && camera!!.cameraInfo.hasFlashUnit()){
                   if(isFlash){
                       camera!!.cameraControl.enableTorch(false); // or false
                       isFlashOn = false
                   }else{
                       camera!!.getCameraControl().enableTorch(true); // or false
                       isFlashOn = true
                   }
               }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
于 2022-02-10T06:06:43.953 回答