我使用Android相机api创建了一个相机应用程序。我正在使用mCamera.takePicture(mShutterCallback,null,mPicture)方法拍摄照片,并在public void onPictureTaken(最终byte []数据,Camera camera){}中进行回调,我在这里调用mCamera.startPreview();这段代码适用于许多照片但有些时候我得到运行时异常startPreview失败了。我在查看日志并在崩溃前找到了以下日志点: -
04-05 15:55:09.116 814-7001/? E/Camera3-Device: Camera 0: getStreamInfo: Device has encountered a serious error
04-05 15:55:09.116 814-7001/? E/Camera2-StreamingProcessor: updatePreviewStream: Camera 0: Error querying preview stream info: Function not implemented (-38)
04-05 15:55:09.116 814-7001/? E/Camera2Client: startPreviewL: Camera 0: Unable to update preview stream: Function not implemented (-38)
04-05 15:55:10.118 814-7001/? E/Camera3-Device: Camera 0: getStreamInfo: Device has encountered a serious error
04-05 15:55:10.118 814-7001/? E/Camera2-StreamingProcessor: updatePreviewStream: Camera 0: Error querying preview stream info: Function not implemented (-38)
04-05 15:55:10.119 814-7001/? E/Camera2Client: startPreviewL: Camera 0: Unable to update preview stream: Function not implemented (-38)
04-05 15:55:10.119 2907-2907/? D/AndroidRuntime: Shutting down VM
--------- beginning of crash
04-05 15:55:10.120 2907-2907/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sample.project, PID: 2907
java.lang.RuntimeException: startPreview failed
at android.hardware.Camera.startPreview(Native Method)
at com.sample.project.screen$18.run(Screen.java:817)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
我在运行oreo 8.0的谷歌Pixel手机上遇到此问题。请给我一些建议继续。
答案 0 :(得分:0)
Android Camera API适用于数十家制造商的数千种不同设备型号。即使他们努力,每个实现都有自己的故障。如果我们软件开发人员足够幸运,那么当我们的应用程序安装 en masse 时,我们会遇到这些问题。
一个规则是任何相机调用都可能触发RuntimeException,在99%的设备和用户成功的场景中,我们没有任何错误。因此,如果您计划广泛的设备支持,则应始终捕获此异常,并为每个失败的调用定义回退。通常,尝试第二次完全相同,只需成功。
另一个规则是旧的已弃用的Camera API和新的camera2 API在兼容模式下工作时可能不太稳定。您的问题表明该设备具有本机camera2支持,但您使用的是旧API。如果您重写代码以直接使用camera2 API,您可能会发现一些故障将会消失或更容易处理。但是不要删除已弃用的API代码:您可以在具有
的设备上找到它CameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
旧代码会更可靠。