最近在做的一个小项目有定位和二维码扫描功能,写好之后打开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。
当这两个权限选择允许的时候就可以使用位置权限以及相机权限了。
