2014-10-10 18 views
25

"Kamera hizmetine bağlanmakta başarısız" durumu nasıl giderilir Android uygulamamı emülatörde çalıştırdığımda kamera servisi özel durumuna bağlanılamıyorum. Mevcut çeşitli yazıları okudum ama hiçbiri bunu düzeltmedi. Bu açıkça başarısız olan Camera.open() çağrısı. Çoğu SO mesajının tartıştığı gibi, web kamerasının emülatöre gitmesini isterdim, ama şimdi sadece uygulamanın bombalamadan çalışmasını istiyorum. Herhangi bir kamera videosunun gösterilip gösterilmeyeceği umrumda değil, çünkü test etmem gereken kamera dışında başka özellikler de var ve öncelikle kamerayı zaten cihazımda test edeceğim.Android emülatöründe

Bildirgem iyi görünüyor. Aşağıdaki satırlar içinde şunlardır: Ben "Emulated" ve 64 şeklinde SD Kart değeri olarak ön ve arka kamera hem belirledik benim AVD yöneticisinde

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

Bunlar önerilen değerler olduğu görülüyor. Tam yığın izi şimdi aşağıda. Çözüm basit bir şey olmalı, ama ne?

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) 

Tüm sınıfın kodu aşağıdadır. Android Developers Docs itibaren

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

Java kodunu kaydeder misiniz lütfen? Ve ayrıca tüm yığın iz? – aProperFox

+0

Tyler, Sorunuzu isteğinize göre güncelledim. – Alyoshak

+0

Teşekkürler, ancak daha fazla Java koduna ihtiyacımız var. Bütün dersi gönderir misin? Sanırım düzgün bir şekilde yapılmadığı için mCamera'nın ilanı. – aProperFox

cevap

29

:: Kamera başka tarafından kullanılıyor ise Camera.open() çağrılması

bir istisna atar Yine, istisna atar Camera.open() çağrısı Uygulama, bu yüzden bir try bloğu içinde sarın. Bunun gibi bir deneyin catch bloğunda bu kodu sarma

Dene:

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

Sonra bir yerde bu işlevi ekleyin:

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

@Alyoshak Bunun işe yaradığını tahmin ediyorum? – aProperFox

+0

Arayan sürümde CallCameraAndPreview() aslında bir şeyleri düzeltiyor. Kamera nasıl olsa da bir türlü kullanılmamış olmalıydı. Neyse, neden myCameraPreview.setCamera (null) çağrısı? Bunu yorumlamak zorundaydım. Bir ImageView nesnesi olan myCameraPreview'de setCamera() yöntemi yok. – Alyoshak

+0

Sadece bunu Android Dev Docs'tan aldım. Kamerayı mcamera = null ile başlatmanın gerekli olabileceğini düşünüyorum; Araştırmam çoğu insanın bunu eklemesi gerektiğini gösterdi. Ya bu kamera sadece başka bir uygulama tarafından kullanılıyordu: P – aProperFox

7

OP onun söz konusu bu bahseder ama sorunum benim AVD emülatörü ayarlarında kamera öykünme etkinleştirmek için unuttum edildi: Android 6 ile

enter image description here

+0

Bu seçeneği AVD'de zaten etkinleştirdim ancak yine de bu hatayı benim emülatörümde alıyorum .. Bir şey mi eksik? –

+0

Bu seçeneği AVD'de zaten etkinleştirdim ancak yine de bu hatayı benim emülatörümde alıyorum. Bir şeyi özlüyorum mu? –

7

.

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

periyodik beyaz bir ekran yerine kamera görünümünü var ise

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

bana

+0

Aynı burada, tamamen yeni android ihtiyaç çalışma zamanı izinlerini :-) unuttum – TSGames

1

için çalışmış kullanma: apaçık yetki kontrol yoksa 0, bu hata appened edebilirsiniz - Kullanım:

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

ve burada

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

ve manifest dosyasında izinleri altında burada

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

1.Use ve her zaman Uygulama etiketi üzerinde izinleri koydu. Kullanıcının MediaRecorder gibi başka bir hizmet tarafından kullanılırken kilidini açın.

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

2.Released kamera düzgün, çok başka bir uygulama ve (biz yeniden açarsanız durumunda) ikinci kez kullanılmak üzere güvenli erişilebilir hale kilidi kullanmayı tercih ediyorum.

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