动态申请权限
注意:manifest中也需要注册
动态申请权限的步骤
- 检查App是否开启了指定权限,调用ContextCompat的checkSelfPermission方法。
- 请求系统弹窗,以便用户选择是否开启权限,调用ActivityCompat的requestPermissions?方法,即可命令系统自动弹出权限申请窗口。
- 判断用户的权限选择结果,重写活动页面的权限请求回调方法onRequestPermissionsResult,在该方法内部处理用户的权限选择结果。
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
public class PermissionActivity extends AppCompatActivity {
public static final String[] PERMISSION_CONNECT = new String[]{
//读通讯录
Manifest.permission.READ_CONTACTS,
//写通讯录
Manifest.permission.WRITE_CONTACTS
};
//通讯录权限对应的RequestCode
public static final int CONTACT_PERMISSION_CODE = 1;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//根据requestCode判断是哪个权限的结果
if (PermissionUtils.checkGrant(grantResults)) {
Toast.makeText(this, "通讯录权限获取成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "通讯录权限获取失败", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
}
public void requestPermission(View view) {
PermissionUtils.checkPermission(this, PERMISSION_CONNECT, CONTACT_PERMISSION_CODE);
}
}
public class PermissionUtils {
public static boolean checkPermission(Activity activity, String[] permissions, int requestCode) {
//Android6.0之后才会用动态申请权限,M就是6.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int check = PackageManager.PERMISSION_GRANTED;
for (String permission : permissions) {
//检查权限
check = ContextCompat.checkSelfPermission(activity, permission);
if (check != PackageManager.PERMISSION_GRANTED) {
break;
}
}
//有权限不被允许则开始申请
if (check != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity,permissions,requestCode);
return false;
}
}
return true;
}
}
跳转到应用的设置界面
private void jumpToSettings() {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getPackageName(), null));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}