安卓SDK6.0以上敏感权限动态申请

1、先在清单文件中将所有需要的权限全部写入;

<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"
    tools:ignore="ProtectedPermissions" />
<!-- 更改设置 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"
    tools:ignore="ProtectedPermissions" />
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 可以提高室内定位的精确度 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 可以提高室内定位的精确度 -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--用于提高GPS定位速度-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<!--读取缓存数据-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

2、在主activity中准备好需要动态申请的权限数组;

/**
 * 所需动态权限
 */
private final String[] permissions = new String[]{
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.READ_PHONE_STATE,
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
};

3、编写动态权限检查方法;判断当前数组里的权限是否都已申请成功;

/**
 * 权限检测
 */
@SuppressLint("ObsoleteSdkInt")
private void checkPermission() {
    boolean hasPermission = true;
    List<String> failPermissions = new ArrayList<>();
    if(Build.VERSION.SDK_INT >= 23) {
        for (int i = 0; i < permissions.length; i++) {
            if (ContextCompat.checkSelfPermission(this, permissions[i])
                    != PackageManager.PERMISSION_GRANTED) {
                hasPermission = false;
                failPermissions.add(permissions[i]);
            }
        }
    }

    if (hasPermission) {
        //全部申请成功,执行下一步操作;
    } else {
        //没有申请的权限执行动态申请;
        ActivityCompat.requestPermissions(this, failPermissions.toArray(
                new String[0]), 1000);
    }
}

4、监听动态申请结果回调;

/**
 * 权限申请回调
 *
 * @param requestCode
 * @param permissions
 * @param grantResults
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1000) {
        boolean hasAllPermission = true;
        for (int i = 0; i < grantResults.length; i++) {
            int grant = grantResults[i];
            if (grant != PackageManager.PERMISSION_GRANTED) {
                hasAllPermission = false;
                break;
            }
        }

        if (hasAllPermission) {
            //权限已全部申请成功,执行下一步操作;
        } else {
            //权限未全部申请成功,或者用户点击了拒绝;执行相应操作;
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值