最近在做的一个小项目有定位和二维码扫描功能,写好之后打开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>

代码运行后的界面展示:

第一个权限:

android 动态修改app 主题 android动态修改manifest_数组

第二个权限:

android 动态修改app 主题 android动态修改manifest_android 动态修改app 主题_02

如果有一个权限点了禁止,弹出提示框:

android 动态修改app 主题 android动态修改manifest_xml_03

点击设置,跳到系统设置去手动开启权限:

android 动态修改app 主题 android动态修改manifest_xml_04

点击取消就退出app。

当这两个权限选择允许的时候就可以使用位置权限以及相机权限了。

一个刚开始进行开发Android的菜鸟,有什么不足的地方请指正。