wake-up-neo.net

Behebung der Ausnahme "Fehler beim Verbindungsaufbau mit dem Kameradienst" im Android-Emulator

Ich erhalte keine Verbindung zu einem Kameradienst, wenn ich meine Android-App im Emulator ausführte. Ich habe die verschiedenen vorhandenen Beiträge gelesen, aber dies wurde nicht behoben. Es ist eindeutig der Aufruf von Camera.open (), der fehlschlägt. Irgendwann würde ich gerne die Webcam im Emulator zum Laufen bringen, wie viele SO -Posten besprechen, aber jetzt möchten Sie nur, dass die App ohne Bombenangriff läuft. Es ist mir egal, ob ein Kameravideo angezeigt wird oder nicht, da es außer der Kamera noch weitere Funktionen gibt, die ich testen muss, und die Kamera in erster Linie auf meinem Gerät testen wird.

Mein Manifest scheint in Ordnung zu sein. Folgende Zeilen sind drin:

<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 meinem AVD-Manager habe ich sowohl die vordere als auch die hintere Kamera auf "Emuliert" und den Wert für die SD-Karte auf 64 eingestellt. Dies scheinen die empfohlenen Werte zu sein. Der vollständige Stack-Trace befindet sich jetzt unten. Die Lösung muss einfach sein, aber was?

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)

Der Code für die gesamte Klasse befindet sich unten. Wieder ist es der Aufruf Camera.open (), der die Ausnahme auslöst:

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();
    }

}
30
Alyoshak

Von den Android Developers Docs :

Beim Aufruf von Camera.open () wird eine Ausnahme ausgelöst, wenn die Kamera bereits von einer anderen Anwendung verwendet wird. Wir wickeln sie also in einen try-Block ein.

Versuchen Sie, den Code wie folgt in einen try catch-Block zu packen:

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();
}

Fügen Sie diese Funktion dann irgendwo hinzu:

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

Bei Android 6.0 kann dieser Fehler angezeigt werden, wenn Sie nicht nach einer Manifestauthentifizierung suchen:

    //If authorisation not granted for camera
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
        //ask for authorisation
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 50);
    else
        //start your camera
        this.startCamera();
8
Kevin ABRIOUX

OP erwähnt dies in seiner Frage, aber ich hatte vergessen, die Kamera-Emulation in meinen AVD-Emulator-Einstellungen zu aktivieren:

 enter image description here

7
Adam Johns

Verwenden

if (ContextCompat.checkSelfPermission(getApplicationContext(), Android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
  ActivityCompat.requestPermissions(CodeScanner.this, new String[]{Android.Manifest.permission.CAMERA}, 50);
}

arbeitete für mich

5
Arnyminer Z

1.Verwenden Sie unterhalb der Berechtigungen in der Manifestdatei und setzen Sie die Berechtigungen immer über dem Application-Tag.

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

2.Use entsperren, während die Kamera von einem anderen Dienst wie MediaRecorder verwendet wird.

camera.unlock();
recorder.setCamera(camera);

2.Release hat die Kamera ordnungsgemäß freigegeben. Ich bevorzuge die Sperre, damit ich für andere Anwendungen und den zweiten Gebrauch sicher zugänglich bin (falls wir sie wieder öffnen).

if (camera != null) {
        camera.lock();
        camera.stopPreview();
        camera.release();
        camera = null;
    }
2
Dattatray Nande

Wenn Sie in regelmäßigen Abständen stattdessen einen weißen Bildschirm sehen, verwenden Sie Folgendes:

private void releaseCameraAndPreview() {
        if (mCamera != null) {
            mCamera.setPreviewCallback(null);
            mCameraView.getHolder().removeCallback(mCameraView);
            mCamera.release();
            mCamera = null;
        }
    }

und leg es hier hin 

try {
            releaseCameraAndPreview();
            mCamera = getCameraInstance();
        }...

und hier

@Override
    protected void onPause() {
        super.onPause();
        releaseCameraAndPreview();
    }
1