如何修复"无法连接到相机服务"除了在Android模拟器模拟器、连接到、相机、QUOT

2023-09-04 09:34:03 作者:提刀杀红眼

我得到一个无法连接到摄像机服务异常,当我跑我在模拟器Android应用程序。我读过现有的各种职位,但没有有固定的这个。这显然​​是Camera.open()调用它是失败的。我希望最终获得网络摄像头会在模拟器中,因为许多SO帖子讨论,但现在只想应用程序,而无需轰炸。我不在乎任何摄像头的视频是否会被显示或不,因为还有另外,我需要测试照相机等功能,并且将主要测试反正我的设备上的摄像头。

我的表现似乎是确定。下面的线是它:

 <使用特征的android:NAME =android.hardware.camera/>
<使用特征的android:NAME =android.hardware.camera.autofocus/>
<使用-权限的Andr​​oid:名称=android.permission.CAMERA>< /使用-许可>
 

在我的AVD经理我已经设置的正面和背面照相机是仿真和SD卡值到64。这些似乎是推荐值。完整的堆栈跟踪现已跌破。解决方案有是一些简单的,但什么?

  8月10日至9日:14:32.375 2628年至2628年/ com.allinlearning.AILAndroidScanner E / AndroidRuntime:致命异常:主要
工艺:com.allinlearning.AILAndroidScanner,PID:2628
java.lang.RuntimeException的:无法连接到摄像机服务
        在android.hardware.Camera.native_setup(本机方法)
        在android.hardware.Camera< INIT>(Camera.java:350)
        在android.hardware.Camera.open(Camera.java:309)
        在com.allinlearning.AILAndroidScanner.AsynCam preview.surfaceCreated(AsynCam preview.java:104)
        在android.view.SurfaceView.updateWindow(SurfaceView.java:572)
        在android.view.SurfaceView.access $ 000(SurfaceView.java:86)
        在android.view.SurfaceView $ 3.on preDraw(SurfaceView.java:175)
        在android.view.ViewTreeObserver.dispatchOn preDraw(ViewTreeObserver.java:847)
        在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1871)
        在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
        在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5670)
        在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)
        在android.view.Choreographer.doCallbacks(Choreographer.java:574)
        在android.view.Choreographer.doFrame(Choreographer.java:544)
        在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)
        在android.os.Handler.handleCallback(Handler.java:733)
        在android.os.Handler.dispatchMessage(Handler.java:95)
        在android.os.Looper.loop(Looper.java:136)
        在android.app.ActivityThread.main(ActivityThread.java:5017)
        在java.lang.reflect.Method.invokeNative(本机方法)
        在java.lang.reflect.Method.invoke(Method.java:515)
        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        在dalvik.system.NativeStart.main(本机方法)
 

在code为整个类如下。再次,它是Camera.open()调用抛出异常:

 进口java.io.IOException异常;
进口的java.util.List;

进口android.graphics.Bitmap;
进口android.graphics.ImageFormat;
进口android.hardware.Camera;
进口android.os.AsyncTask;
进口android.os.Handler;
进口android.os.Looper;
进口android.util.Log;
进口android.view.SurfaceHolder;
进口android.webkit.MimeTypeMap;
进口android.widget.ImageView;

公共类AsynCam preVIEW延伸MainActivity
        实现SurfaceHolder.Callback,摄像头。previewCallback
{

    私人相机mCamera;
    公共Camera.Parameters PARAMS;
    私人SurfaceHolder的sholder;
    私人ImageView的myCamera preVIEW = NULL;
    私人位图mBitmap = NULL;

    //数据数组
    私人INT []像素= NULL;
    私人浮法[] floatpixels = NULL;
    私人字节[] FrameData = NULL;

    //相机PARAMS
    公众持股量maxZoom;
    私人诠释的imageformat;
    私人诠释previewSizeWidth;
    私人诠释previewSizeHeight;
    私人诠释CAMID = 1;

    //标志和数量
    私人布尔bProcessing = FALSE;
    私人诠释frameCount = 0;
    私人布尔doProcessing = FALSE;
    公共布尔mProcessInProgress = FALSE;

    公共静态最终字符串变量=AsynCam preVIEW;

    专用长mTiming [] =新长[50];
    私人诠释mTimingSlot = 0;

    处理器mHandler =新的处理程序(Looper.getMainLooper());

    静态{
//的System.loadLibrary(ImageProcessing);
        Log.i(TAG,本地库加载);
    }

    公共AsynCam preVIEW(INT previewLayoutWidth,诠释previewLayoutHeight,ImageView的摄像头preVIEW)
    {
        previewSizeWidth = previewLayoutWidth;
        previewSizeHeight = previewLayoutHeight;
        myCamera preVIEW =相机preVIEW;
    }


    @覆盖
    在previewFrame公共无效(byte []的数据,摄像头摄像头)
    {
        //什么也不做,现在
    }

    @覆盖
    公共无效surfaceCreated(SurfaceHolder持有者){
        // TODO自动生成方法存根
        的sholder =持有人;
        如果(CAMID == 0){
            mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
        }
        其他 {
            mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
        }

        尝试 {
            mCamera.set previewDisplay(保持器);
            mCamera.set previewCallback(本);
        }赶上(IOException异常E){
            mCamera.release();
            mCamera = NULL;
        }

        PARAMS = mCamera.getParameters();
    }

    @覆盖
    公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,
                               INT高度){
        // TODO自动生成方法存根
        PARAMS = mCamera.getParameters();
        名单< Camera.Size>尺寸= params.getSupportedPictureSizes();
        this.params.set previewSize(previewSizeWidth,previewSizeHeight);

        mBitmap = Bitmap.createBitmap(previewSizeWidth,previewSizeHeight,
                Bitmap.Config.ARGB_8888);
        myCamera preview.setImageBitmap(mBitmap);

        像素=新INT [previewSizeWidth * previewSizeHeight]。
        // floatpixels =新的浮动[previewSizeWidth * previewSizeHeight * 3]。
        =的imageformat params.get previewFormat();
        mCamera.setParameters(PARAMS);
        mCamera.start preVIEW();

    }

    @覆盖
    公共无效surfaceDestroyed(SurfaceHolder持有者){
        // TODO自动生成方法存根
        mCamera.set previewCallback(空);
        mCamera.stop preVIEW();
        mCamera.release();
        mCamera = NULL;
    }

    @覆盖
    公共无效的onPause(){
        this.mCamera.stop preVIEW();
    }

}
 
微信无法使用数据流量打开怎么办

解决方案

从 Android开发文档:

  

调用Camera.open()抛出一个异常,如果相机已被其他应用程序使用,所以我们在一个try块包装它。

尝试包装的code在try catch块像这样:

 尝试{
    releaseCameraAnd preVIEW();
    如果(CAMID == 0){
        mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
    }
    其他 {
        mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
    }
}赶上(例外五){
    Log.e(的getString(R.string.app_name),无法打开摄像机);
    e.printStackTrace();
}
 

然后在某处添加此功能:

 私人无效releaseCameraAnd preVIEW(){
    myCamera preview.setCamera(空);
    如果(mCamera!= NULL){
        mCamera.release();
        mCamera = NULL;
    }
}
 

I'm getting a Fail to connect to camera service exception when I run my Android app in the emulator. I've read the various existing posts but none have fixed this. It is clearly the Camera.open() call which is failing. I would eventually like to get the webcam going in the emulator, as many SO posts discuss, but right now just want the app to run without bombing. I do not care whether any camera video gets shown or not, since there are other features besides the camera that I need to test, and will primarily test the camera on my device anyway.

My manifest seems to be ok. The following lines are in it:

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

In my AVD manager I have set both the front and back camera to be "Emulated" and the SD Card value to 64. These seem to be the recommended values. The full stack trace is now below. Solution has to be something straightforward, but what?

10-09 08:14:32.375    2628-2628/com.allinlearning.AILAndroidScanner E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.allinlearning.AILAndroidScanner, PID: 2628
java.lang.RuntimeException: Fail to connect to camera service
        at android.hardware.Camera.native_setup(Native Method)
        at android.hardware.Camera.<init>(Camera.java:350)
        at android.hardware.Camera.open(Camera.java:309)
        at com.allinlearning.AILAndroidScanner.AsynCamPreview.surfaceCreated(AsynCamPreview.java:104)
        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:1871)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
        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:5017)
        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:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

The code for the entire class is below. Again, it's the Camera.open() call that throws the exception:

import java.io.IOException;
import java.util.List;

import android.graphics.Bitmap;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.SurfaceHolder;
import android.webkit.MimeTypeMap;
import android.widget.ImageView;

public class AsynCamPreview extends MainActivity
        implements SurfaceHolder.Callback,  Camera.PreviewCallback
{

    private Camera mCamera;
    public Camera.Parameters params;
    private SurfaceHolder sHolder;
    private ImageView myCameraPreview = null;
    private Bitmap mBitmap = null;

    // data arrays
    private int[] pixels = null;
    private float[] floatpixels = null;
    private byte[] FrameData = null;

    // Camera params
    public float maxZoom;
    private int imageFormat;
    private int previewSizeWidth;
    private int previewSizeHeight;
    private int camId = 1;

    // flags and counts
    private boolean bProcessing = false;
    private int frameCount = 0;
    private boolean doProcessing = false;
    public boolean mProcessInProgress = false;

    public static final String TAG = "AsynCamPreview";

    private long mTiming[] = new long[50];
    private int mTimingSlot = 0;

    Handler mHandler = new Handler(Looper.getMainLooper());

    static {
//      System.loadLibrary("ImageProcessing");
        Log.i(TAG, "Native library loaded");
    }

    public AsynCamPreview(int previewLayoutWidth, int previewLayoutHeight, ImageView cameraPreview)
    {
        previewSizeWidth = previewLayoutWidth;
        previewSizeHeight = previewLayoutHeight;
        myCameraPreview =cameraPreview;
    }


    @Override
    public void onPreviewFrame(byte[] data, Camera camera)
    {
        // Do nothing for now
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        sHolder = holder;
        if (camId == 0) {
            mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
        }
        else {
            mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
        }

        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.setPreviewCallback(this);
        } catch (IOException e) {
            mCamera.release();
            mCamera= null;
        }

        params = mCamera.getParameters();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                               int height) {
        // TODO Auto-generated method stub
        params = mCamera.getParameters();
        List<Camera.Size> sizes = params.getSupportedPictureSizes();
        this.params.setPreviewSize(previewSizeWidth, previewSizeHeight);

        mBitmap = Bitmap.createBitmap(previewSizeWidth, previewSizeHeight,
                Bitmap.Config.ARGB_8888);
        myCameraPreview.setImageBitmap(mBitmap);

        pixels = new int[previewSizeWidth * previewSizeHeight];
        //floatpixels = new float[previewSizeWidth * previewSizeHeight * 3];
        imageFormat = params.getPreviewFormat();
        mCamera.setParameters(params);
        mCamera.startPreview();

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        mCamera.setPreviewCallback(null);
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    @Override
    public void onPause() {
        this.mCamera.stopPreview();
    }

}

解决方案

From the Android Developers Docs:

Calling Camera.open() throws an exception if the camera is already in use by another application, so we wrap it in a try block.

Try wrapping that code in a try catch block like so:

try {
    releaseCameraAndPreview();
    if (camId == 0) {
        mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
    }
    else {
        mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
    }
} catch (Exception e) {
    Log.e(getString(R.string.app_name), "failed to open Camera");
    e.printStackTrace();
}

Then add this function somewhere:

    private void releaseCameraAndPreview() {
    myCameraPreview.setCamera(null);
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}