android 应用申请多组权限:
android 6.0以上,申请危险权限,需要用户授权,以下为申请1组或者多组用户权限的操作
1.首先在AndroidManifest.xml清单文件中声明所需要的权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
2.封装检查权限的工具类PermissionUtil,检查是否拥有某个权限具体如下:
public class PermissionUtil {
private static final String TAG = "PermissionUtil";
/**
* 检查某项权限是否授权
*
* @param context
* @return
*/
public static boolean checkPermission(Context context, String permission) {
if (context == null || TextUtils.isEmpty(permission)) {
return false;
}
Log.d(TAG, "check permission : " + permission);
PackageManager pm = context.getPackageManager();
int hasPerm = pm.checkPermission(permission, context.getPackageName());
return hasPerm == PackageManager.PERMISSION_GRANTED;
}
}
3.在Activity中检查权限,方法如下:
* 检查必要权限
*/
public void checkPermissions() {
List<String> permissionList = new ArrayList<>();
//location
if (!PermissionUtil.checkPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (!PermissionUtil.checkPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
permissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
//phone
if (!PermissionUtil.checkPermission(this, Manifest.permission.READ_PHONE_STATE)) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (!PermissionUtil.checkPermission(this, Manifest.permission.CALL_PHONE)) {
permissionList.add(Manifest.permission.CALL_PHONE);
}
if (!PermissionUtil.checkPermission(this, Manifest.permission.READ_CALL_LOG)) {
permissionList.add(Manifest.permission.READ_CALL_LOG);
}
if (!PermissionUtil.checkPermission(this, Manifest.permission.WRITE_CALL_LOG)) {
permissionList.add(Manifest.permission.WRITE_CALL_LOG);
}
if (!PermissionUtil.checkPermission(this, Manifest.permission.PROCESS_OUTGOING_CALLS)) {
permissionList.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
}
//contacts
if (!PermissionUtil.checkPermission(this, Manifest.permission.READ_CONTACTS)) {
permissionList.add(Manifest.permission.READ_CONTACTS);
}
//camera
if (!PermissionUtil.checkPermission(this, Manifest.permission.CAMERA)) {
permissionList.add(Manifest.permission.CAMERA);
}
//sms
if (!PermissionUtil.checkPermission(this, Manifest.permission.SEND_SMS)) {
permissionList.add(Manifest.permission.SEND_SMS);
}
//storage
if (!PermissionUtil.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (permissionList.size() != 0)
requestPermissions(permissionList.toArray(new String[permissionList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
}
4.重写Activity的onRequestPermissionsResult方法,
判断结果是否有禁止不在访问选项,如果有的话,弹出AlertDialog,跳转到应用详情页面让用户手动授予权限,如果没有权限结束当前页面,如果全部权限都已经容易,进行相应的操作,代码如下:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS) {
// if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Toast.makeText(MainActivity.this, "申请权限成功", Toast.LENGTH_SHORT).show();
// read();
// }
boolean result = true;
List<String> needPermissionList = new ArrayList<>();
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
result = false;
String permission = permissions[i];
if (!shouldShowRequestPermissionRationale(permission)) {
Log.d("wangjingjie", "need permission permission : " + permission + " size:" + needPermissionList.size());
needPermissionList.add(permission);
}
}
}
Log.d("wangjingjie", "need persmission list size :" + needPermissionList.size());
if (needPermissionList.size() > 0) {
showMessageOkCanecl();
return;
}
Log.d("wangjingjie", "permission result:" + result);
if (!result) {
Toast.makeText(this, "需要赋予权限才能使用此应用", Toast.LENGTH_SHORT).show();
finish();
}else {
read();
}
}
}
private void showMessageOkCanecl() {
new AlertDialog.Builder(this).setMessage("为了保证应用正常运行,请进入设置开启必要权限").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri packageURI = Uri.parse("package:" + MainActivity.this.getPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
startActivity(intent);
finish();
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).show();
}