2015-08-14 26 views
3

我在StackOverflow上搜索了很多關於此錯誤的信息,但一直未能找到解決方案。RuntimeException:未能連接到攝像機服務

這是個例外:

java.lang.RuntimeException: Fail to connect to camera service 
      at android.hardware.Camera.native_setup(Native Method) 
      at android.hardware.Camera.<init>(Camera.java:351) 
      at android.hardware.Camera.open(Camera.java:325) 
      at com.app.app.Scatta.surfaceCreated(Scatta.java:232) 
      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:1867) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600) 
      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:5001) 
      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:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 

Camera.open被稱爲內void surfaceCreated

的應用程序崩潰,這是我的代碼:

public class Scatta extends Activity implements SurfaceHolder.Callback { 

    android.hardware.Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.scatta_layout); 

    surfaceView = (SurfaceView) findViewById(R.id.camerapreview); 
    surfaceHolder = surfaceView.getHolder(); 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    controlInflater = LayoutInflater.from(getBaseContext()); 
    viewControl = controlInflater.inflate(R.layout.camera_layout, null); 

    ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
    this.addContentView(viewControl, layoutParams); 

    RelativeLayout relativeLayout = (RelativeLayout) viewControl.findViewById(R.id.relative_camera); 
    relativeLayout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      camera.autoFocus(autoFocusCallback); 
     } 
    }); 

...

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    if (camera == null){ 

     camera = android.hardware.Camera.open(); ////////this is the row 232 

     try{ 

      camera.setPreviewDisplay(holder); 

     }catch (IOException e) { 
      e.printStackTrace(); 

      camera.release(); 
      camera = null; 
     } 
    } 
} 


@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    if (previewing) { 

     camera.stopPreview(); 

    } 
    else { 

     android.hardware.Camera.Parameters parameters = camera.getParameters(); 
     Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

     if (display.getRotation() == Surface.ROTATION_90){ 
      parameters.setPreviewSize(width, height); 
     } 
     if (display.getRotation() == Surface.ROTATION_0) { 
      parameters.setPreviewSize(height, width); 
      camera.setDisplayOrientation(90); 
     } 
     if (display.getRotation() == Surface.ROTATION_180) { 
      parameters.setPreviewSize(height, width); 
     } 
     if (display.getRotation() == Surface.ROTATION_270) { 
      parameters.setPreviewSize(width, height); 
      camera.setDisplayOrientation(180); 
     } 

     parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_AUTO); 

     List<android.hardware.Camera.Size> sizes = parameters.getSupportedPictureSizes(); 

     size = sizes.get(0); 

     parameters.setPictureSize(size.width, size.height); 

     camera.setParameters(parameters); 

     Thread preview_thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 

       camera.startPreview(); 
      } 
     }, "preview_thread"); 
     preview_thread.start(); 

     previewing = true; 
    } 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

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

,這是AndroidManifest.xml

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

<application 
... 

奇怪的是,在三星Galaxy酷睿我看不出這個問題,但是在榮譽6存在以及在模擬器(Genymotion)

設備的工作原理是怎麼樣的,但在另一個設備上,而不是在同一個Android版本上?

+0

第一次打開它還是僅在第二次嘗試後才發生? – George

+0

@GeorgeR這是第一次發生這樣的事情 – Ilario

+0

試一下if(預覽){camera.stopPreview(); camera.release();} – userDroid

回答

0

寫在你的gradle.build targetSdkVersion 22.這是一個臨時的解決方案,但工作。

+0

感謝您的回答,我爲了工作而改變了很多代碼:) – Ilario

相關問題