繁体   English   中英

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

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

我正在为大多数版本的Android重新编写应用程序。 该应用程序设置为在启动时调用android.hardware.Camera.Open() 应用启动时,出现错误Camera Error: Could not connect to camera

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"/>`.

为什么无法连接到相机?

问题解决了!

这个问题仅仅是大写问题。 <uses-permission android:name="android.permission.camera"/>应实际读取<uses-permission android:name="android.permission.CAMERA"/> 发生这种情况是因为camera是硬件功能,而CAMERA是允许的。

对于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
        }
    }

在早期版本的android中,为了使用摄像头硬件,足以说明适当的权限并在android清单中使用,但是由于棉花糖版本已经出现,因此无法再运行该应用程序。 由于还需要启用运行时权限。 考虑使用类似的代码,并使其适合您的项目,因为它使您有机会检查和启用权限。

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

使用相机弃用

下面是代码

更新--->

  @Module
public class CameraModule {

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

然后对于旧目标:

 @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;
    }
}

对于新目标:

  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