studio running emulators emulator devices detected android camera android-emulator emulation intellij-13

running - Cómo reparar la excepción "No se puede conectar con el servicio de la cámara" en el emulador de Android



android studio''s emulator (7)

¿No es un permiso en android 6.x?

http://developer.android.com/training/permissions/requesting.html

Recibo una excepción de error al conectarme a la cámara cuando ejecuto mi aplicación de Android en el emulador. He leído las diversas publicaciones existentes pero ninguna ha solucionado esto. Es claramente la llamada Camera.open () que está fallando. Finalmente me gustaría poner la cámara web en funcionamiento en el emulador, como comentan muchos puestos SO, pero ahora solo quiero que la aplicación se ejecute sin bombardeos. No me importa si se muestra o no algún video de la cámara, ya que hay otras funciones además de la cámara que necesito probar, y de todas maneras probaré la cámara en mi dispositivo.

Mi manifiesto parece estar bien. Las siguientes líneas están en él:

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

En mi administrador de AVD, configuré tanto la cámara frontal como la posterior para que sean "Emuladas" y el valor de la tarjeta SD en 64. Estos parecen ser los valores recomendados. El seguimiento completo de la pila está ahora debajo. La solución tiene que ser algo sencillo, ¿pero qué?

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)

El código para toda la clase está debajo. De nuevo, es la llamada a Camera.open () la que arroja la excepción:

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


OP menciona esto en su pregunta, pero mi problema era que olvidé habilitar la emulación de la cámara en la configuración de mi emulador AVD:


Con Android 6.0, este error puede activarse si no verifica la autorización del manifiesto:

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


De los desarrolladores de Android Docs :

Llamar a Camera.open () arroja una excepción si la cámara ya está siendo utilizada por otra aplicación, por lo que la envolvemos en un bloque de prueba.

Intenta envolver ese código en un bloque try catch como ese:

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

Luego agrega esta función en alguna parte:

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


Utilizando

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

trabajó para mi


Si periódicamente tiene una pantalla blanca en su vista de la cámara, use:

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

y ponlo aqui

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

y aquí

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


1. Utilice los permisos inferiores en el archivo de manifiesto y siempre coloque los permisos encima de la etiqueta de la aplicación.

<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.Utilice Desbloquear mientras la cámara sea utilizada por otro servicio como MediaRecorder.

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

2.Carga lanzada correctamente, prefiero usar el candado para que sea accesible de forma segura para otra aplicación y uso por segunda vez (en caso de que volvamos a abrir).

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