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 { //权限未全部申请成功,或者用户点击了拒绝;执行相应操作; } } }