几天前Google发布了Android6.0的正式版,我迫不及待的刷了机...5儿子被我折腾了个够...
6.0中变化最大的就是加入了权限管理,应用使用权限不再那么的自由了,开发者需要再用到权限时请求权限征得用户的统一才能得到权限。
对于我们开发者来说,如果你想我一样追求最先进的代码,喜欢用最新的API来开发,那么这篇文章对你来说是有用的,好了,废话有点多,上干货:
ContextCompat.checkSelfPermission(),该方法用来检查是否有权限,例如:
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
如果应用已经被许可该去权限则返回PackageManager.PERMISSION_GRANTED ,并且该应用可以继续操作。如果应用程序没有权限,该方法返回PERMISSION_DENIED ,和应用程序有明确要求权限的用户。
如果你的应用程序需要被列入应用清单是一个危险的权限,则必须向用户授予权限。 Android提供了几种方法,你可以用它来申请许可。调用这些方法带来了一个标准的Android对话框,您不能自定义。
调用
ActivityCompat.shouldShowRequestPermissionRationale() (如果是在fragment中则直接调用shouldShowRequestPermissionRationale())方法
如果应用程序请求此权限之前用户拒绝了这已要求该方法返回true,如果用户拒绝了许可要求在过去并选择在许可请求的系统对话框中不要再问选项,此方法返回false 。如果设备政策禁止从具有权限的应用程序的方法也返回false 。
如果改方法返回的是false我们就弹出一个对话框告诉用户要请求该权限的用途,并希望征得用户的同意。
如果应用程序还没有获取到它所需要的权限,应用程序必须调用ActivityCompat.requestPermissions()方法(如果是在fragment中则直接调用requestPermissions())来请求相应的权限。您的应用程序传递它想要的权限,还您指定要识别该许可请求的整数请求代码。这种方法的功能异步:这将立即返回,并在用户响应该对话框,系统调用应用程序的回调方法的结果,通过该应用程序传递给requestPermissions相同的请求的代码。
完整代码:
if (ContextCompat.checkSelfPermission(parentActivity,
android.Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (!shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE)) {
new AlertDialogFragment.Builder(parentActivity)
.setMessage("请同意读取外部存储权限")
.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
PERMISSION_REQUSET_STORAGE);
}
})
.setNegativeButton(R.string.cancel, null)
.create()
.show(getFragmentManager());
return;
}
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
PERMISSION_REQUSET_STORAGE);
return;
}
最后在你的activity或是fragment中重载onRequestPermissionsResult()方法进行后续操作
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSION_REQUSET_STORAGE: // 请求权限码
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
// todo what you want
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
//parentActivity.finish();
}
break;
}
}