android - RuntimeException:无法连接到相机服务

标签 android android-camera runtimeexception

我在 StackOverflow 上搜索了很多有关此错误的信息,但未能找到解决方案。

这是异常(exception)情况:

java.lang.RuntimeException: Fail to connect to camera service
            at android.hardware.Camera.native_setup(Native Method)
            at android.hardware.Camera.<init>(Camera.java:351)
            at android.hardware.Camera.open(Camera.java:325)
            at com.app.app.Scatta.surfaceCreated(Scatta.java:232)
            at android.view.SurfaceView.updateWindow(SurfaceView.java:572)
            at android.view.SurfaceView.access$000(SurfaceView.java:86)
            at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:175)
            at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1867)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:544)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

void surfaceCreated 中调用 Camera.open 时应用崩溃

这是我的代码:

public class Scatta extends Activity implements SurfaceHolder.Callback {

  android.hardware.Camera camera;
  SurfaceView surfaceView;
  SurfaceHolder surfaceHolder;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.scatta_layout);

    surfaceView = (SurfaceView) findViewById(R.id.camerapreview);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    controlInflater = LayoutInflater.from(getBaseContext());
    viewControl = controlInflater.inflate(R.layout.camera_layout, null);

    ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    this.addContentView(viewControl, layoutParams);

    RelativeLayout relativeLayout = (RelativeLayout) viewControl.findViewById(R.id.relative_camera);
    relativeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            camera.autoFocus(autoFocusCallback);
        }
    });

...

@Override
public void surfaceCreated(SurfaceHolder holder) {
    if (camera == null){

        camera = android.hardware.Camera.open(); ////////this is the row 232

        try{

            camera.setPreviewDisplay(holder);

        }catch (IOException e) {
            e.printStackTrace();

            camera.release();
            camera = null;
        }
    }
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)  {

    if (previewing) {

        camera.stopPreview();

    }
    else  {

        android.hardware.Camera.Parameters parameters = camera.getParameters();
        Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

        if (display.getRotation() == Surface.ROTATION_90){
            parameters.setPreviewSize(width, height);
        }
        if (display.getRotation() == Surface.ROTATION_0) {
            parameters.setPreviewSize(height, width);
            camera.setDisplayOrientation(90);
        }
        if (display.getRotation() == Surface.ROTATION_180) {
            parameters.setPreviewSize(height, width);
        }
        if (display.getRotation() == Surface.ROTATION_270) {
            parameters.setPreviewSize(width, height);
            camera.setDisplayOrientation(180);
        }

        parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_AUTO);

        List<android.hardware.Camera.Size> sizes = parameters.getSupportedPictureSizes();

        size = sizes.get(0);

        parameters.setPictureSize(size.width, size.height);

        camera.setParameters(parameters);

        Thread preview_thread = new Thread(new Runnable() {
            @Override
            public void run() {

                camera.startPreview();
            }
        }, "preview_thread");
        preview_thread.start();

        previewing = true;
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

    if (camera != null){
        camera.stopPreview();
        camera.release();
        camera = null;
    }
}

这是 AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<application
 ...

奇怪的是,在 Samsung Galaxy Core2 中我看不到这个问题,但在 Honor 6 中以及在模拟器 (Genymotion) 中也有

怎么可能一台设备运行正常,而在另一台运行相同 Android 版本的设备上却不行?

最佳答案

在你的 gradle.build targetSdkVersion 22 中写入。这是一个临时解决方案,但有效。

关于android - RuntimeException:无法连接到相机服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32010064/

相关文章:

android - 如何在android中制作聊天图标?

android - 调用相机时,三星 Intent For OnActivityResult 为 Null

java - 如何从 Executors 中正确捕获 RuntimeExceptions?

安卓java.lang.RuntimeException : Unable to instantiate activity

error-handling - Anylogic - 内部错误 : Engine still has x events scheduled: xyz: [null]

android - 无法将图片从 drawable 发布到 facebook

android - 膨胀后 subview 为空

android - [ native ] : Using Java functions & 3rd-party libraries in Qt for Android

java - 改变相机方向android

android - 为什么我的 Android 相机预览显示横向,即使我已将应用程序 list 设置为纵向?