简体   繁体   English

为什么在使用android.hardware.Camera.Open()时我的应用程序崩溃?

[英]Why does my app crash when using android.hardware.Camera.Open()?

I am re-writing an app for most versions of Android. 我正在为大多数版本的Android重新编写应用程序。 The app is set to call android.hardware.Camera.Open() on launch. 该应用程序设置为在启动时调用android.hardware.Camera.Open() When the app launches it gives the error Camera Error: Could not connect to camera 应用启动时,出现错误Camera Error: Could not connect to camera

The permissions in AndroidManifest.xml are AndroidManifest.xml中的权限为

<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-permission android:name="android.permission.camera"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>`.

Why can't it connect to the camera? 为什么无法连接到相机?

Problem solved! 问题解决了!

The issue was simply a matter of capitalization. 这个问题仅仅是大写问题。 The line <uses-permission android:name="android.permission.camera"/> should actually read <uses-permission android:name="android.permission.CAMERA"/> . <uses-permission android:name="android.permission.camera"/>应实际读取<uses-permission android:name="android.permission.CAMERA"/> This happened because camera is a hardware feature, while CAMERA is a permission. 发生这种情况是因为camera是硬件功能,而CAMERA是允许的。

Not only declaring in manifest but also You need to grant permission from user in the run time for Android 6.+ Use the below snippet for granting camera permission 对于Android 6.+不仅要在manifest声明,还需要在运行时授予用户permission Android 6.+使用以下代码片段授予camera permission

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            if (ContextCompat.checkSelfPermission(SplashScreenActivty.this, Manifest.permission.CAMERA)
                                    != PackageManager.PERMISSION_GRANTED) {
                                ActivityCompat.requestPermissions(this,
                                        new String[]{Manifest.permission.CAMERA},
                                        1);
                            } 

                        }


 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case 1: {

                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {


                    // permission was granted, yay! Do the
                    // camera-related task you need to do.
                } else {

                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.

                    Toast.makeText(this, "Permission denied to read SMS", Toast.LENGTH_SHORT).show();
                    finish();
                }
            }

            // other 'case' lines to check for other
            // permissions this app might request
        }
    }

In previous versions of android in order to use camera hardware there was enough to state proper permissions and uses in android manifest, but since the Marshmallow version has appeared it's not enough to run the app anymore. 在早期版本的android中,为了使用摄像头硬件,足以说明适当的权限并在android清单中使用,但是由于棉花糖版本已经出现,因此无法再运行该应用程序。 As there is also need to enable runtime permissions. 由于还需要启用运行时权限。 Consider using similar code, and suit it to your project, as it gives You opportunity to check and enable permission. 考虑使用类似的代码,并使其适合您的项目,因为它使您有机会检查和启用权限。

  @Override
public void onRequestPermissionsResult(int requestCode,  String[] permissions, int[] grantResults) {
    if (requestCode == PERMISSION_REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            cameraPreview.initializeCamera();
        } else {

        }
        return;
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PERMISSION_REQUEST_CODE) {
        cameraPreview.initializeCamera();
        return;
    }
    super.onActivityResult(requestCode, resultCode, data);
}


   public void requestCameraPermission() {
    ActivityCompat.requestPermissions(this,
            new String[]{
                    Manifest.permission.CAMERA
            },
            PERMISSION_REQUEST_CODE);
}

public void requestPermissionWithRationale() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
        Snackbar.make(findViewById(android.R.id.content), R.string.no_cam_permission, Snackbar.LENGTH_INDEFINITE)
                .setAction(R.string.snackbar_action_grant, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        requestCameraPermission();
                    }
                })
                .show();
    } else {
        requestCameraPermission();
    }
}

Use Camera for Deprecated 使用相机弃用

Below is the code 下面是代码

UPDATE ---> 更新--->

  @Module
public class CameraModule {

    @Provides
    CameraSupport provideCameraSupport() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            return new CameraNew(context);
        } else {
            return new CameraOld();
        }
    }
}

and then for Old target : 然后对于旧目标:

 @SuppressWarnings("deprecation")
public class CameraOld implements CameraSupport {

    private Camera camera;

    @Override
    public CameraSupport open(final int cameraId) {
        this.camera = Camera.open(cameraId);
        return this;
    }

    @Override
    public int getOrientation(final int cameraId) {
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(cameraId, info);
        return info.orientation;
    }
}

for New Target : 对于新目标:

  public class CameraNew implements CameraSupport {

    private CameraDevice camera;
    private CameraManager manager;

    public CameraNew(final Context context) {
        this.manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public CameraSupport open(final int cameraId) {
        try {
            String[] cameraIds = manager.getCameraIdList();
            if (ActivityCompat.checkSelfPermission(CameraPreview.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.

                return null;
            }
            manager.openCamera(cameraIds[cameraId], new CameraDevice.StateCallback() {
                @Override
                public void onOpened(CameraDevice camera) {
                    CameraNew.this.camera = camera;
                }

                @Override
                public void onDisconnected(CameraDevice camera) {
                    CameraNew.this.camera = camera;
                    // TODO handle
                }

                @Override
                public void onError(CameraDevice camera, int error) {
                    CameraNew.this.camera = camera;
                    // TODO handle
                }
            }, null);
        } catch (Exception e) {
            // TODO handle
        }
        return this;
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public int getOrientation(final int cameraId) {
        try {
            String[] cameraIds = manager.getCameraIdList();
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraIds[cameraId]);
            return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
        } catch (CameraAccessException e) {
            // TODO handle
            return 0;
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM