Platform: RK3288
OS: Android 6.0
Kernel: 3.10.92
背景:
自己写了个Camera Preview程序做验证,出现了exception,log如下:
01-03 13:46:08.801 2334 2334 E AndroidRuntime: FATAL EXCEPTION: main
01-03 13:46:08.801 2334 2334 E AndroidRuntime: Process: com.example.camerapreviewtest, PID: 2334
01-03 13:46:08.801 2334 2334 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.setPreviewDisplay(android.view.SurfaceHolder)' on a null object reference
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at com.example.camerapreviewtest.MainActivity$CameraPreview.surfaceCreated(MainActivity.java:65)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.SurfaceView.updateWindow(SurfaceView.java:583)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:177)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2055)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:670)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:606)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:743)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5456)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:772)
01-03 13:46:08.801 2334 2334 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:662)
对应代码:
public void surfaceCreated(SurfaceHolder holder){
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
}catch (IOException e){
}
}
原因:
1.机器上只有一颗Camera,并且注册的是Front,camera默认打开的是back camera.
public static Camera open() {
int numberOfCameras = getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < numberOfCameras; i++) {
getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
return new Camera(i);
}
}
return null;
}
2.AndroidManifest.xml 中Camera权限没打开
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
3. 运行时权限没打开,路径在 Settings -> Apps -> [App Name] -> Permissions
参考:
An error occurred while connecting to camera: 0 — Fail to connect to camera service