【Android Studio】Camera.Parameters parameters = mCamera.getParameters();NullPointerException空指针异常

小声bb:这是我解决的很玄学的一个问题,如果有大佬知道解决的真正原理是什么麻烦告诉我一下XDDD提前谢谢。

我找到错误原因了!


【版本】

【Android Studio】Camera.Parameters parameters = mCamera.getParameters();NullPointerException空指针异常_第1张图片

minSdkVersion 24
targetSdkVersion 28
versionCode 1
versionName "1.0"

【问题描述】

   我在CSDN上找了一个自定义相机项目:https://blog.csdn.net/leo_huang720/article/details/81289309

   在其中的预览界面时出错:没有出现原本该有的拍摄预览界面;

   同时运行的时候闪退+报错

【报错信息】

(错误的根源)

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' on a null object reference

【错误代码】

Camera.Parameters parameters = mCamera.getParameters();

【错误原因】

在安卓6.0以上版本中对于相机授权不能只是在AnroidMainfest里写


如果你是安卓6.0以上版本并且你的项目中只在AnroidMainfest中申明了上述权限,那么你还需要在手机(或者你的虚拟机)里面找到应用权限,这时你会发现它的相机权限是关闭的!这就是闪退的原因!解决闪退问题直接把它的相机权限打开就可以了。

【解决办法】

以下提供了两个解决办法,请优先使用第一个。

办法一

在你的项目的第一个活动(就是打开app调用的第一个类)中加入

    public static final int CAMERA_REQ_CODE = 111;

    private void requestPermission() {
        // 判断当前Activity是否已经获得了该权限
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

            // 如果App的权限申请曾经被用户拒绝过,就需要在这里跟用户做出解释
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.CAMERA)) {
                Toast.makeText(LoginActivity.this,"请进入设置-应用管理-打开相机权限",Toast.LENGTH_SHORT).show();

            } else {
                // 进行权限请求
                ActivityCompat
                        .requestPermissions(
                                this,
                                new String[]{Manifest.permission.CAMERA},
                                CAMERA_REQ_CODE);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        if(requestCode==CAMERA_REQ_CODE) {
            // 如果请求被拒绝,那么通常grantResults数组为空
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 申请成功,进行相应操作
            } else {
                // 申请失败,可以继续向用户解释。
                Toast.makeText(LoginActivity.this, "没有相机权限,您可能无法正常使用本应用", Toast.LENGTH_LONG).show();
            }
        }
    }

并且在这个类的onCreate函数中加入以下函数

requestPermission();

它们的作用就跟现在用app刚安装好打开它弹出来的一样,效果如下:

【Android Studio】Camera.Parameters parameters = mCamera.getParameters();NullPointerException空指针异常_第2张图片

具体原理可百度其他人的博客安卓6.0以上获取相机权限。

办法二

1.在app目录下的build.gradle中将targetSdkVersion的版本改成22或者低于22,点击Sync Now

【Android Studio】Camera.Parameters parameters = mCamera.getParameters();NullPointerException空指针异常_第3张图片

2.此时右下角会有一个warning,不用管它

【Android Studio】Camera.Parameters parameters = mCamera.getParameters();NullPointerException空指针异常_第4张图片

3.运行项目,会提醒你

【Android Studio】Camera.Parameters parameters = mCamera.getParameters();NullPointerException空指针异常_第5张图片

点击OK

4.此时发现可以成功运行并拍照,这是虚拟机上显示的结果(这个项目调用的前置摄像头)

【Android Studio】Camera.Parameters parameters = mCamera.getParameters();NullPointerException空指针异常_第6张图片

在手机上则可以正常运行

5.最玄学的一步来了!再把之前改的

 targetSdkVersion 

又改回 28 !再次Sync Now并运行项目,你会发现,依旧!成!功!了!(因为你虚拟机上的相机权限已经被打开了),但是只有虚拟机上成功orz要想在手机上也能成功运行还是要版本22及以下

你可能感兴趣的:(Android,Studio)