android获取摄像头id,Camera2 上cameraid问题。

在尝试使用Camera2 API打开Android设备的非默认摄像头时,出现NullPointerException错误。问题源于尝试从null对象引用中调用trim()方法。此问题可能由于未正确设置或获取摄像头ID导致,尤其是当尝试使用CameraCharacteristics.LENS_FACING_BACK作为字符串ID时。解决方案包括确保正确转换和验证摄像头ID,并检查权限和设备支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我可以打开默认摄像头,但是打不开其他的摄像头。

private void openCamera(final int width, final int height) {

setUpCameraOutputs(width, height);

configureTransform(width, height);

final CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

try {

if (!cameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {

throw new RuntimeException("Time out waiting to lock camera opening.");

}

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

Log.w(TAG, "checkSelfPermission CAMERA");

}else{

// manager.openCamera(mCameraId, stateCallback, null);

mCameraId= Integer.toString(CameraCharacteristics.LENS_FACING_BACK);

manager.openCamera(mCameraId, stateCallback, backgroundHandler);

Log.d(TAG, "open Camera");

}

} catch (final CameraAccessException e) {

Log.e(TAG, "Exception!", e);

} catch (final InterruptedException e) {

throw new RuntimeException("Interrupted while trying to lock camera opening.", e);

}

}

错误日志

Process: me.immi.mycare, PID: 8487

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference

at java.lang.StringToReal.parseFloat(StringToReal.java:304)

at java.lang.Float.parseFloat(Float.java:306)

at android.hardware.Camera$Parameters.getFloat(Camera.java:6451)

at android.hardware.Camera$Parameters.getExposureCompensationStep(Camera.java:5142)

at android.hardware.camera2.legacy.LegacyMetadataMapper.mapControlAe(LegacyMetadataMapper.java:473)

at android.hardware.camera2.legacy.LegacyMetadataMapper.mapCharacteristicsFromParameters(LegacyMetadataMapper.java:183)

at android.hardware.camera2.legacy.LegacyMetadataMapper.createCharacteristics(LegacyMetadataMapper.java:154)

at android.hardware.camera2.CameraManager.getCameraCharacteristics(CameraManager.java:207)

at me.immi.mycare.nosleep.Camera2ForNoSleepActivity.setUpCameraOutputs(Camera2ForNoSleepActivity.java:266)

at me.immi.mycare.nosleep.Camera2ForNoSleepActivity.openCamera(Camera2ForNoSleepActivity.java:133)

at me.immi.mycare.nosleep.Camera2ForNoSleepActivity.access$000(Camera2ForNoSleepActivity.java:60)

at me.immi.mycare.nosleep.Camera2ForNoSleepActivity$1.onSurfaceTextureAvailable(Camera2ForNoSleepActivity.java:205)

at android.view.TextureView.getHardwareLayer(TextureView.java:370)

at android.view.View.updateDisplayListIfDirty(View.java:14212)

at android.view.View.getDisplayList(View.java:14272)

at android.view.View.draw(View.java:15057)

at android.view.ViewGroup.drawChild(ViewGroup.java:3528)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3322)

at android.view.View.updateDisplayListIfDirty(View.java:14234)

at android.view.View.getDisplayList(View.java:14272)

at android.view.View.draw(View.java:15057)

at android.view.ViewGroup.drawChild(ViewGroup.java:3528)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3322)

at android.view.View.updateDisplayListIfDirty(View.java:14234)

at android.view.View.getDisplayList(View.java:14272)

at android.view.View.draw(View.java:15057)

at android.view.ViewGroup.drawChild(ViewGroup.java:3528)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3322)

at android.view.View.updateDisplayListIfDirty(View.java:14234)

at android.view.View.getDisplayList(View.java:14272)

at android.view.View.draw(View.java:15057)

at android.view.ViewGroup.drawChild(ViewGroup.java:3528)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3322)

at android.view.View.updateDisplayListIfDirty(View.java:14234)

at android.view.View.getDisplayList(View.java:14272)

at android.view.View.draw(View.java:15057)

at android.view.ViewGroup.drawChild(ViewGroup.java:3528)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3322)

at android.view.View.updateDisplayListIfDirty(View.java:14234)

at android.view.View.getDisplayList(View.java:14272)

at android.view.View.draw(View.java:15057)

at android.view.ViewGroup.drawChild(ViewGroup.java:3528)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3322)

at android.view.View.updateDisplayListIfDirty(View.java:14234)

at android.view.View.getDisplayList(View.java:14272)

at android.view.View.draw(View.java:15057)

at android.view.ViewGroup.drawChild(ViewGroup.java:3528)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3322)

at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchDraw(PhoneWindow.java:2667)

at android.view.View.draw(View.java:15364)

at android.widget.FrameLayout.draw(FrameLayout.java:647)

at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2646)

at android.view.View.updateDisplayListIfDirty(View.java:14242)

at android.view.View.getDisplayList(View.java:14272)

at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:267)

at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:273)

at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:312)

at android.view.ViewRootImpl.draw(ViewRootImpl.java:2852)

at android.view.ViewRootImp

为什么会报这个错误啊?cameraid一般默认为0,我写0的时候不会报这个错,其他的我写1和2都会报这个错。

Cameraid是string类型, LENS_FACING_FRONT=0 ,LENS_FACING_BACK=1 ,这些是int类型。

有人遇到过吗

Android中,Camera2 API允许开发者精细控制相机的各种特性,包括镜头角度。获取最远的广角摄像头通常意味着选择焦距最小、视野最大的镜头。以下是使用Camera2获取最远广角摄像头的基本步骤: 1. **初始化CameraManager**:首先需要创建一个`CameraManager`实例,用于管理系统的相机设备。 ```java CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); ``` 2. **查询可用相机列表**:通过`cameraManager.getCameraIdList()`获取所有可用的相机ID列表。 3. **查找最大广角相机**:遍历每个相机ID,检查其信息,例如`CameraCharacteristics.LENS_FACING`和`CameraCharacteristics.SensorInfo.MAX_HORIZONTAL_RESOLUTION`等属性。一般来说,具有"BACK"或"FACING_CROSSLENS"(超广角)标志的摄像头是广角镜头。 ```java for (String cameraId : cameraManager.getCameraIdList()) { try { CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); int facing = characteristics.get(CameraCharacteristics.LENS_FACING); if (facing == CameraCharacteristics.LENS_FACING_BACK || facing == CameraCharacteristics.LENS_FACING_CROSSLENS) { // 这可能是广角摄像头 } } catch (CameraAccessException e) { Log.e("Camera", "Failed to get camera characteristics for id: ", e); } } ``` 4. **选择相机**:找到满足条件的最远广角摄像头后,可以打开它进行拍照或录像操作。注意,在选择之前可能需要先申请权限并处理预览启动等问题。 ```java cameraManager.openCamera(cameraId, ...); // 使用找到的cameraId ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值