【Android(安卓)Studio】Camera.Parameters parameters = mCamera.getParameters();NullPointerException空指针异常
小声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及以下
更多相关文章
- Android—使用ShareSDK实现新浪微博分享
- vnc 项目的几点总结
- Android(安卓)Studio 快速启动 Android(安卓)NDK 项目开发
- AndroidDeveloper Weekly NO.4
- Android(安卓)6.0 新特性之 RunTime Permissions
- Android(安卓)Studio项目将Module依赖(lib)转成jar包
- unity Android(安卓)串口通讯完整项目实例
- Android(安卓)6.0 Permission
- android项目迁移到androidX:类映射(android.support.constraint*)