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

我找到错误原因了!


【版本】

minSdkVersion 24targetSdkVersion 28versionCode 1versionName "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刚安装好打开它弹出来的一样,效果如下:

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

办法二

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

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

3.运行项目,会提醒你

点击OK

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

在手机上则可以正常运行

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

 targetSdkVersion 

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

更多相关文章

  1. Android—使用ShareSDK实现新浪微博分享
  2. vnc 项目的几点总结
  3. Android(安卓)Studio 快速启动 Android(安卓)NDK 项目开发
  4. AndroidDeveloper Weekly NO.4
  5. Android(安卓)6.0 新特性之 RunTime Permissions
  6. Android(安卓)Studio项目将Module依赖(lib)转成jar包
  7. unity Android(安卓)串口通讯完整项目实例
  8. Android(安卓)6.0 Permission
  9. android项目迁移到androidX:类映射(android.support.constraint*)

随机推荐

  1. 【Android布局】在程序中设置android:gra
  2. Mono for Android(安卓)实现高效的导航
  3. Android中的Shape使用总结
  4. Android应用程序进程启动过程(后篇)
  5. 【Android布局】在程序中设置android:gra
  6. Android(安卓)引用library project
  7. Android中数据存储的5种方法
  8. Android(安卓)动态加载(六) - 360开源框架D
  9. Android(安卓)面试题总结之Android(安卓)
  10. android文字阴影效果