最近在做的一个小项目有定位和二维码扫描功能,写好之后打开app提示我位置权限和相机权限没有打开,无法获取当前位置信息,也无法打开二维码相机进行扫描。
解决方法:
在AS清单文件AndroidManifest.xml中要获取对应的静态权限:
//相机权限
<uses-permission android:name="android.permission.CAMERA" />
//网络权限
<uses-permission android:name="android.permission.INTERNET" />
//位置权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
然后在对应的Activity里面用代码去获取对应的动态权限:
这里是Android需要动态申请的权限:Android需要动态申请的权限
请求相机和位置权限的实例
MainActivity.java中代码:
public class MainActivity extends AppCompatActivity {
//权限返回码
private final int mRequestCode = 100;
List<String> mPermissionList = new ArrayList<>();
//声明一个数组,将需要申请的权限放在里面
//可以是一个权限,也可以是多个权限(你需要什么权限就添加什么权限)
String[] permissions = new String[]{
Manifest.permission.CAMERA,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.INTERNET,
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态申请权限
initPermission();
}
//动态请求权限
private void initPermission() {
//清空没有通过的权限
mPermissionList.clear();
//逐个判断是否还有未通过的权限
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) !=
PackageManager.PERMISSION_GRANTED) {
//添加还未授予的权限到mPermissionList中
mPermissionList.add(permissions[i]);
}
}
//申请权限
if (mPermissionList.size() > 0) {
//有权限没有通过,需要申请
ActivityCompat.requestPermissions(this, permissions, mRequestCode);
} else {
//权限已经通过,进行的后续操作
}
}
/**
* 动态请求权限的回调方法
*
* @param requestCode 是我们自己定义的权限请求码
* @param permissions 是我们请求的权限名称数组
* @param grantResults 是我们在弹出页面后是否允许权限的标识数组,数组的长度对应的是权限
* 名称数组的长度,数组的数据0表示允许权限,-1表示我们点击了禁止权限
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean hasPermissionDismiss = false;//有权限没有通过
if (mRequestCode == requestCode) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == -1) {
hasPermissionDismiss = true;
break;
}
}
}
if (hasPermissionDismiss) {
//如果有未被允许的权限
showPermissionDialog();
} else {
//权限已经都通过了,进行的后续操作
}
}
/**
* 不再提示权限时的展示对话框
*/
AlertDialog mPermissionDialog;
private void showPermissionDialog() {
if (mPermissionDialog == null) {
mPermissionDialog = new AlertDialog.Builder(this)
.setMessage("权限被禁止,请手动开启")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cancelPermissionDialog();
//跳转到设置里去手动开启权限
Uri uri = Uri.fromParts("package", getPackageName(), null);
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(uri);
startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭页面或者做其他操作
cancelPermissionDialog();
MainActivity.this.finish();
}
})
.create();
}
mPermissionDialog.show();
}
private void cancelPermissionDialog() {
mPermissionDialog.cancel();
}
activity_main.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".view.activity.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello Word!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
代码运行后的界面展示:
第一个权限:
第二个权限:
如果有一个权限点了禁止,弹出提示框:
点击设置,跳到系统设置去手动开启权限:
点击取消就退出app。
当这两个权限选择允许的时候就可以使用位置权限以及相机权限了。