2014-10-10 15 views
25

Ricevo un errore di connessione all'eccezione del servizio fotocamera quando eseguo la mia app Android nell'emulatore. Ho letto i vari post esistenti ma nessuno ha risolto questo problema. È chiaramente la chiamata a Camera.open() che sta fallendo. Alla fine mi piacerebbe far entrare la webcam nell'emulatore, come molti post SO discutono, ma in questo momento voglio solo che l'app funzioni senza bombardamenti. Non mi interessa se viene mostrato o meno alcun video della telecamera, dal momento che ci sono altre funzionalità oltre alla fotocamera che devo testare, e comunque testerà principalmente la fotocamera sul mio dispositivo.Come risolvere l'eccezione "Impossibile connettersi al servizio fotocamera" nell'emulatore Android

Il mio manifest sembra essere ok. Le seguenti linee sono in esso:

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

Nel mio manager AVD ho impostato sia la parte anteriore e la fotocamera posteriore per essere "emulato" e il valore SD Card a 64. Questi sembrano essere i valori consigliati. La traccia dello stack completo è ora sotto. La soluzione deve essere qualcosa di semplice, ma cosa?

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) 

Il codice per l'intera classe è di seguito. Anche in questo caso, è la chiamata Camera.open() che genera l'eccezione:

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

} 
+0

Potrebbe pubblicare il codice Java per favore? E anche l'intera traccia dello stack? – aProperFox

+0

Tyler, ho aggiornato la domanda secondo la tua richiesta. – Alyoshak

+0

Grazie, anche se probabilmente avremo bisogno di più del codice Java. Puoi pubblicare l'intera classe? Suppongo che sia la dichiarazione di mCamera che non è stata eseguita correttamente. – aProperFox

risposta

29

Dal Android Developers Docs:

Calling Camera.open() genera un'eccezione se la fotocamera è già in uso da un altro applicazione, quindi lo avvolgiamo in un blocco try.

Try avvolgimento che il codice in un blocco catch try in questo modo:

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

Poi aggiungere questa funzione da qualche parte:

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

@Alyoshak Immagino che questo funzionerà allora? – aProperFox

+0

Mi sembra che chiamare releaseCameraAndPreview() sia ciò che ha effettivamente corretto le cose. La fotocamera doveva essere stata in qualche modo in uso, anche se non riuscivo a vedere come. In ogni caso, perché la chiamata a myCameraPreview.setCamera (null)? Ho dovuto commentare. Nessun metodo setCamera() su myCameraPreview, che è un oggetto ImageView. – Alyoshak

+0

L'ho appena preso da Android Dev Docs. Penso che potrebbe essere stata la necessità di inizializzare la fotocamera con mcamera = null; La mia ricerca ha dimostrato che molte persone avevano bisogno di aggiungere questo. O quello o solo che la fotocamera era in uso da un'altra applicazione: P – aProperFox

7

OP menziona questo nella sua interrogazione, ma il mio problema è stato ho dimenticato di abilitare l'emulazione macchina fotografica nelle mie impostazioni emulatore AVD:

enter image description here

+0

Ho già abilitato questa opzione in AVD, ma sto ancora ricevendo questo errore nel mio emulatore .. Mi manca qualcosa? –

+0

Ho già abilitato questa opzione in AVD, ma sto ancora ricevendo questo errore nel mio emulatore .. Mi manca qualcosa? –

7

Con Android 6.0, questo errore può appened se non si verifica per l'autorizzazione manifesta:

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

Utilizzando

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

ha lavorato per me

+0

Anche qui, ho completamente dimenticato che il nuovo Android ha bisogno di permessi di runtime :-) – TSGames

1

Se periodicamente ottenuto una schermata bianca al posto vostro punto di vista della macchina fotografica - utilizzo:

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

e metterlo qui

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

e qui

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

1.Utilizzare seguito autorizzazioni in file manifesto e sempre messo i permessi la tag Application.

<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" /> 

Unlock 2.Utilizzare mentre la fotocamera utilizzata da altro servizio come MediaRecorder.

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

2.Released fotocamera correttamente, io preferisco usare il blocco in modo da diventare tranquillamente accessibili per altre applicazioni e l'uso secondo tempo (Nel caso in cui si riprendono).

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