2014-10-10 13 views
25

में "कैमरा सेवा से कनेक्ट करने में विफल" को ठीक करने के लिए कैसे करें जब मैं एमुलेटर में अपना एंड्रॉइड ऐप चलाता हूं तो मुझे कैमरा सेवा अपवाद से कनेक्ट करने में विफलता मिल रही है। मैंने विभिन्न मौजूदा पोस्ट पढ़ी हैं लेकिन किसी ने इसे ठीक नहीं किया है। यह स्पष्ट रूप से Camera.open() कॉल है जो असफल रहा है। अंततः मैं एमुलेटर में जा रहा वेबकैम प्राप्त करना चाहता हूं, क्योंकि कई एसओ पोस्ट चर्चा करते हैं, लेकिन अभी सिर्फ ऐप को बमबारी के बिना चलाने की इच्छा है। मुझे कोई परवाह नहीं है कि कोई कैमरा वीडियो दिखाया गया है या नहीं, क्योंकि कैमरे के अलावा अन्य सुविधाएं भी हैं जिन्हें मुझे परीक्षण करने की आवश्यकता है, और मुख्य रूप से मेरे डिवाइस पर कैमरे का परीक्षण करेंगे।एंड्रॉइड एमुलेटर

मेरा मैनिफेस्ट ठीक लगता है। निम्नलिखित लाइनों उस में कर रहे हैं:

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

मेरी AVD प्रबंधक मैं "नकल" और 64 के लिए एसडी कार्ड मूल्य होने के लिए आगे और पीछे कैमरा स्थापित किया है में इन अनुशंसित मान होने लगते हैं। पूर्ण स्टैक ट्रेस अब नीचे है। समाधान कुछ सरल होना चाहिए, लेकिन क्या?

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) 

संपूर्ण कक्षा का कोड नीचे है।

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

क्या आप जावा कोड पोस्ट कर सकते हैं? और पूरे ढेर का निशान भी? – aProperFox

+0

टायलर, मैंने आपके अनुरोध के अनुसार प्रश्न अपडेट किया है। – Alyoshak

+0

धन्यवाद, हालांकि हमें जावा कोड की अधिक आवश्यकता होगी। क्या आप पूरी कक्षा पोस्ट कर सकते हैं? मुझे लगता है कि यह एमकेमेरा की घोषणा है जो ठीक से नहीं किया गया है। – aProperFox

उत्तर

29

Android Developers Docs से::

Camera.open() कॉलिंग एक अपवाद फेंकता है तो कैमरा किसी अन्य के द्वारा पहले से उपयोग में एक बार फिर, यह Camera.open() कॉल कि अपवाद फेंकता है आवेदन, इसलिए हम इसे एक कोशिश ब्लॉक में लपेटें।

तो जैसे एक कोशिश पकड़ ब्लॉक में है कि कोड लपेटकर कोशिश:

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

फिर इस समारोह कहीं जोड़ें:

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

@ एलोशक मैं अनुमान लगा रहा हूं कि यह तब काम करता है? – aProperFox

+0

मुझे लगता है कि रिलीज कॉल करना कैमरा और पूर्वावलोकन() वास्तव में निश्चित चीजें हैं। कैमरा किसी भी तरह उपयोग में होना चाहिए, हालांकि मैं नहीं देख सका। किसी भी तरह, myCameraPreview.setCamera (शून्य) क्यों कॉल करें? मुझे इसे टिप्पणी करना पड़ा। MyCameraPreview पर कोई setCamera() विधि नहीं है, जो एक ImageView ऑब्जेक्ट है। – Alyoshak

+0

मैंने अभी एंड्रॉइड देव डॉक्स से इसे पकड़ लिया है। मुझे लगता है कि कैमरे को mcamera = null के साथ शुरू करने की आवश्यकता हो सकती है; मेरे शोध से पता चला कि ज्यादातर लोगों को इसे जोड़ने की जरूरत है। या तो कैमरे का उपयोग किसी अन्य एप्लिकेशन द्वारा किया गया था: पी – aProperFox

13

एंड्रॉयड 6.x पर एक अनुमति नहीं है?

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

+1

दरअसल, मार्शमलो 6.0 के बाद से यह है। कैमरा (और अन्य) के लिए अनुमति ऐप सेटिंग्स से अक्षम/सक्षम किया जा सकता है। सेटिंग्स -> ऐप्स -> [YourApp] -> अनुमतियाँ –

+1

यह मेरे लिए भी समस्या थी, एपीआई 23 – moof2k

7

ओपी अपने प्रश्न में यह उल्लेख है, लेकिन मेरे इस मुद्दे को मैं अपने AVD एमुलेटर सेटिंग में कैमरा अनुकरण सक्षम करने के लिए भूल गया था:

enter image description here

+0

मैंने पहले ही इस विकल्प को एवीडी में सक्षम कर दिया है लेकिन फिर भी मुझे यह त्रुटि मेरे एमुलेटर में मिल रही है .. क्या मुझे कुछ याद आ रहा है? –

+0

मैंने पहले ही इस विकल्प को एवीडी में सक्षम कर दिया है लेकिन फिर भी मुझे यह त्रुटि मेरे एमुलेटर में मिल रही है .. क्या मुझे कुछ याद आ रहा है? –

7
एंड्रॉयड 6 के साथ

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

का उपयोग

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

मुझे

+0

वही है, पूरी तरह से भूल गया कि नए एंड्रॉइड को रनटाइम अनुमतियों की आवश्यकता है :-) – TSGames

1

के लिए काम किया आप समय-समय पर एक सफेद स्क्रीन के बजाय कैमरे के अपने दृष्टिकोण को मिला है: 0, इस त्रुटि अगर आप प्रकट प्राधिकरण के लिए की जांच नहीं करते appened कर सकते हैं - उपयोग:

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

और इसे यहाँ डाल

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

और यहाँ मैनिफ़ेस्ट फ़ाइल में अनुमतियाँ नीचे

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

1.Use और हमेशा आवेदन टैग के ऊपर अनुमतियाँ डाल दिया।

<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. मीडियारकॉर्डर जैसी अन्य सेवा द्वारा उपयोग किए जाने वाले कैमरे के दौरान अनलॉक का उपयोग करें।

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

2.Released कैमरा ठीक है, मैं लॉक का उपयोग करने के लिए इतना अन्य अनुप्रयोग और दूसरी बार उपयोग (मामले में अगर हम फिर से खोलना) के लिए सुरक्षित रूप से सुलभ हो पसंद करते हैं।

if (camera != null) { 
     camera.lock(); 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 
संबंधित मुद्दे