升级过gradle后运行应用发现拍照和定位功能不能用了,查看log日志重点的错误信息分别如下:
java.lang.RuntimeException: Fail to connect to camera service
location provider requires ACCESS_COARSE_LOCATION permission.
两个解决方式
1 将gradle中编译SDK改为22以下。自Android6.0后系统加强了隐私保护,只是在清单文件添加权限申请前提下还得要动态获取权限。
2 动态获取权限
定位:
private static final int MY_PERMISSION_LOCATION = 255;//0-255
private void gpsPremissionCheck() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& this.checkSelfPermission(
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& this.checkSelfPermission(
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSION_LOCATION);
} else {
//SDK编译版本低于22,直接运行
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSION_LOCATION
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//申请权限成功,do some thing you want.
}else {
//finish();
}
}
拍照:
/** 获取权限*/
private void getPermission() {
if (Build.VERSION.SDK_INT>22){
if (ContextCompat.checkSelfPermission(this,
android.Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
//先判断有没有权限 ,没有就在这里进行权限的申请
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE},CAMERA_OK);
}else {
//说明已经获取到摄像头权限了
}
}else {
Log.i("MainActivity","这个说明系统版本在6.0之下,不需要动态获取权限。");
}
}