ERROR: failed to connect to camera service @ Android marshmallow

匿名 (未验证) 提交于 2019-12-03 01:01:02

问题:

Im trying to build a camera app (Im pretty new at this) When I run the application on real device its gives me this Error:

    05-26 13:16:37.504 14076-14076/involved.pose9 E/AndroidRuntime: FATAL EXCEPTION: main                                                             Process: involved.pose9, PID: 14076                                                             java.lang.RuntimeException: Fail to connect to camera service                                                                 at android.hardware.Camera.<init>(Camera.java:511)                                                                 at android.hardware.Camera.open(Camera.java:368)                                                                 at involved.pose9.CameraActivity.surfaceCreated(CameraActivity.java:63)                                                                 at android.view.SurfaceView.updateWindow(SurfaceView.java:582)                                                                 at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:177)                                                                 at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)                                                                 at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067)                                                                 at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119)                                                                 at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6060)                                                                 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)                                                                 at android.view.Choreographer.doCallbacks(Choreographer.java:670)                                                                 at android.view.Choreographer.doFrame(Choreographer.java:606)                                                                 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)                                                                 at android.os.Handler.handleCallback(Handler.java:746)                                                                 at android.os.Handler.dispatchMessage(Handler.java:95)                                                                 at android.os.Looper.loop(Looper.java:148)                                                                 at android.app.ActivityThread.main(ActivityThread.java:5443)                                                                 at java.lang.reflect.Method.invoke(Native Method)                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

This is my Class

    import android.graphics.PixelFormat;     import android.hardware.Camera;     import android.support.v7.app.AppCompatActivity;     import android.os.Bundle;     import android.view.SurfaceHolder;     import android.view.SurfaceView;     import android.view.Window;     import android.view.WindowManager;      import java.io.IOException;      public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback {  SurfaceHolder mSurfaceHolder; SurfaceView mSurfaceView; public Camera mCamera; boolean mPreviewRunning;  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);       getWindow().setFormat(PixelFormat.TRANSLUCENT);     requestWindowFeature(Window.FEATURE_NO_TITLE);     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,             WindowManager.LayoutParams.FLAG_FULLSCREEN);     setContentView(R.layout.activity_camera);     mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);     mSurfaceHolder = mSurfaceView.getHolder();     mSurfaceHolder.addCallback(this);     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); }  @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {     // TODO Auto-generated method stub       if (mPreviewRunning) {         mCamera.stopPreview();     }     Camera.Parameters p = mCamera.getParameters();     //p.setPreviewSize(w, h);     mCamera.setParameters(p);     try {         mCamera.setPreviewDisplay(arg0);     } catch (IOException e) {         e.printStackTrace();     }     mCamera.startPreview();     mPreviewRunning = true; }  @Override public void surfaceCreated(SurfaceHolder holder) {     // TODO Auto-generated method stub     mCamera = Camera.open(); }  @Override public void surfaceDestroyed(SurfaceHolder holder) {     // TODO Auto-generated method stub     mCamera.stopPreview();     mPreviewRunning = false;     mCamera.release(); }  Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {     public void onPictureTaken(byte[] imageData, Camera c) {     } }; } 

What is wrong here? Thanks in advance..

I also declare permissions in manifest.xml

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

回答1:

You need to give android.hardware.Camera permission programmatically.

MANIFEST PERMISSIONS WON'T WORK on Android 6

With marshmallow(newest version of Android). We have got some restrictions in Using Sensitive permissions like : Storage,Contacts access, etc..In edition to give these permissions in manifest, We need to request them from users at Runtime.

For more details refer this : Android M permissions

Add this code in your activity :

@Override protected void onStart() {     super.onStart();      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {          int hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);          List<String> permissions = new ArrayList<String>();          if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {             permissions.add(Manifest.permission.CAMERA);          }          if (!permissions.isEmpty()) {             requestPermissions(permissions.toArray(new String[permissions.size()]), 111);         }     }   } 

Add this after onActivityResult :

@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {     switch (requestCode) {         case 111: {             for (int i = 0; i < permissions.length; i++) {                 if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {                     System.out.println("Permissions --> " + "Permission Granted: " + permissions[i]);                   } else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {                     System.out.println("Permissions --> " + "Permission Denied: " + permissions[i]);                  }             }         }         break;         default: {             super.onRequestPermissionsResult(requestCode, permissions, grantResults);         }     } } 


回答2:

In marshmellow onwards the OS permisson are supposed to be taken at runtime. The camera permission also has to be take at run time Please check the below link to see how to ask permission at runtime. https://developer.android.com/training/permissions/requesting.html

Quick Solution : This is a fix but you can use for current marshmellow version Try adding this in your build.gradle file

targetSdkVersion 22 


回答3:

on Marshmallow you have to ask user for grant permission at run time something like this

int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,         Manifest.permission.WRITE_CALENDAR);  if(permissionCheck == PackageManager.PERMISSION_GRANTED){ //user granted you }else{ //the user denied your permission } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!