android6.0动态权限申请

已经有一年多没有写博客了,主要就是忙。自己独立开发的确有点累,很多东西都要自己去脑补,遇到问题也没有可商量的同事,所以只能自己想办法解决。闲话少说,言归正传!
6.0动态权限的申请已经有很长时间了,网上也有很多案例,应某些人要求,这里我只是提供下我自己的见解!
之所以会有动态权限的申请,还是因为android手机做的越来越安全了,也越来越人性化了,同时对开发者来说是越来越麻烦了。有些涉及到用户的隐私的权限,是用户不想让其它应用获取到的(如:定位、联系人、读写文件…)。所以android就把这些关于个人隐私的权限交由用户自己来决定,涉及到的动态权限主要有(下图是从别处复制过来的)
在这里插入图片描述
以上权限如果只是在配置清单里面配置是获取不到任何权限的,那么这些权限是如何申请的呢?

/**
 * 发起权限请求
 *
 * @param context
 * @param permissions
 * @param callback
 */
public void requestPermissions(final Context context, final String[] permissions,
                               RequestPermissionCallBack callback) {
    this.mRequestPermissionCallBack = callback;
    List<String> permissionNames = PermissionUtils.transformText(this, Arrays.asList(permissions));
    StringBuilder permissionName = new StringBuilder();
    for (String s : permissionNames) {
        permissionName = permissionName.append(s + "\r\n");
    }
    //如果所有权限都已授权,则直接返回授权成功,只要有一项未授权,则发起权限请求
    boolean isAllGranted = true;
    for (String permission : permissions) {
        if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED) {
            isAllGranted = false;

            if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, permission)) {
                new AlertDialog.Builder(context)
                        .setMessage("您好,此操作需要如下权限:\r\n" +
                                permissionName +
                                " 请允许,否则此操作讲无法进行。")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ActivityCompat.requestPermissions(((Activity) context), permissions, mRequestCode);
                            }
                        }).show();
            } else {
                ActivityCompat.requestPermissions(((Activity) context), permissions, mRequestCode);
            }

            break;
        }
    }
    if (isAllGranted) {
        mRequestPermissionCallBack.granted();
        return;
    }
}

在应用被打开需要申请权限,弹出权限申请提示框,被用户不小心点成拒绝或不想给予权限,也就是说我们的权限申请被拒绝了,又该如何操作呢?其实我们申请权限的时候是有一个回调的,告诉我们申请权限的结果

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    boolean hasAllGranted = true;
    List<String> permissionNames = PermissionUtils.transformText(MyBaseAty.this, Arrays.asList(permissions));
    StringBuilder permissionName = new StringBuilder();
    for (String s : permissionNames) {
        permissionName = permissionName.append(s + "\r\n");
    }
    switch (requestCode) {
        case mRequestCode: {
            for (int i = 0; i < grantResults.length; ++i) {
                if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                    hasAllGranted = false;
                    //在用户已经拒绝授权的情况下,如果shouldShowRequestPermissionRationale返回false则
                    // 可以推断出用户选择了“不在提示”选项,在这种情况下需要引导用户至设置页手动授权
                    if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
                        new AlertDialog.Builder(this)
                                .setMessage("您好!由于您选择了不再提示这项操作,导致获取权限失败\r\n" +
                                        "获取相关权限如下:\r\n" +
                                        permissionName +
                                        "请前往设置页面手动授权")
                                .setPositiveButton("去授权", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                        Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null);
                                        intent.setData(uri);
                                        startActivity(intent);
                                    }
                                })
                                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        mRequestPermissionCallBack.denied();
                                    }
                                }).setOnCancelListener(new DialogInterface.OnCancelListener() {
                            @Override
                            public void onCancel(DialogInterface dialog) {
                                mRequestPermissionCallBack.denied();
                            }
                        }).show();

                    } else {
                        //用户拒绝权限请求,但未选中“不再提示”选项
                        mRequestPermissionCallBack.denied();
                    }
                    break;
                }
            }
            if (hasAllGranted) {
                mRequestPermissionCallBack.granted();
            }
        }
    }
}

关于权限请求接口的回调是自己写的

/**
 * 权限请求结果回调接口
 */
public interface RequestPermissionCallBack {
    /**
     * 同意授权
     */
    void granted();

    /**
     * 取消授权
     */
    void denied();
}

有了上面这些代买还是不够的,因为我们上面的代码并没有看到有任何权限出现,其实上面的代码只是实现的一个基类而已,就是方便大家使用的时候可以多处调用,下面以申请读写为例来实现具体的权限申请。其实很简单,请看如下代码

public void requestMultiPermission() {
    requestPermissions(this, new String[]{
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE},
            new MainAty.RequestPermissionCallBack() {
                @Override
                public void granted() {
                //获取权限成功的操作
                }

                @Override
                public void denied() {
            	 //获取失败的操作
                }
            });
}

别以为是动态权限就不需要在配置清单里面设置用户权限了,请切记!上面说的不要只是在配置清单里面设置就可以了,并不是说不要再配置清单里面设置权限申请的

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

通过上面的代码是不是感觉动态申请权限其实并没有那么复杂?
效果图如下
在这里插入图片描述
点击下载源码

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于 Android 6.0 以上权限问题,可能是由于您的应用没有正确申请权限导致的。您可以通过以下步骤检查和解决该问题: 1. 在 AndroidManifest.xml 文件中声明应用需要的权限。例如,如果您的应用需要访问网络,则需要添加以下权限声明: ``` <uses-permission android:name="android.permission.INTERNET" /> ``` 2. 在运行时检查权限。您可以使用以下代码检查是否拥有所需权限: ``` if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted, request it ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, REQUEST_CODE); } else { // Permission is granted, continue with the task } ``` 3. 处理用户的权限请求响应。当您使用 `ActivityCompat.requestPermissions()` 请求权限时,系统会显示一个对话框,询问用户是否授予权限。您需要在 `onRequestPermissionsResult()` 回调方法中处理用户的响应,例如: ``` @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission is granted, continue with the task } else { // Permission is denied, show a message to the user } } } ``` 至于 TBS 内核加载失败的问题,可能是由于权限问题导致的。您可以尝试按照上述步骤检查和解决权限问题,如果仍然无法解决问题,请提供更多详细信息,以便我更好地帮助您解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值