我正在尝试使用 Google Play 服务重新实现 Redlaser 条形码扫描仪。并面对手电筒的问题。Android hardware.Camera对象不能与gms.vision中的CameraSource共同使用。有没有机会使用手电筒和谷歌条形码扫描仪?
问问题
6102 次
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 实现。这个新版本包括一个打开手电筒的选项,应该可以解决这个问题。看这里:
于 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 回答