小声bb:这是我解决的很玄学的一个问题,如果有大佬知道解决的真正原理是什么麻烦告诉我一下XDDD提前谢谢。
我找到错误原因了!
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刚安装好打开它弹出来的一样,效果如下:
具体原理可百度其他人的博客安卓6.0以上获取相机权限。
办法二
1.在app目录下的build.gradle中将targetSdkVersion的版本改成22或者低于22,点击Sync Now
2.此时右下角会有一个warning,不用管它
3.运行项目,会提醒你
点击OK
4.此时发现可以成功运行并拍照,这是虚拟机上显示的结果(这个项目调用的前置摄像头)
在手机上则可以正常运行
5.最玄学的一步来了!再把之前改的
targetSdkVersion
又改回 28 !再次Sync Now并运行项目,你会发现,依旧!成!功!了!(因为你虚拟机上的相机权限已经被打开了),但是只有虚拟机上成功orz要想在手机上也能成功运行还是要版本22及以下