对于Android 5.1或者更低版本,或者应用的目标SDK是22或者更低,如果列出了需要访问用户私密信息的危险权限,那么用户必须在安装时授予此权限。从Android 6.0(API 23)开始,用户在应用运行时向其授予危险权限,而不是在安装时授予。
为什么?
这可以简化应用安装过程,因为用户在安装或者更新应用时不需要授予权限;
还让用户可以对应用的功能进行更多的控制,例如用户可以为相机应用提供相机访问权限,而不提供设备位置的访问权限。
检查应用的权限
如果应用需要危险权限,则每次执行需要该危险权限的操作时,都需要检查应用是否具有该权限,比如应用需要读取SD卡中的内容,那么每次执行读取操作时,都要检查是否有读取SD卡的权限,这是因为用户可能随时终止该应用的访问SD卡的权限。
ContextCompact.checkSelfPermission(Activity, Manifest.permission.READ_EXTERNAL_STORAGE):如果应用有该权限,则返回 PackageManager.PERMISSION_GRANTED
;如果应用没有此权限,则返回 PackageManager.PERMISSION_DENIED
,此时需要显式向用户请求权限。
请求权限
requestPermission(Activity activity, String [] permissions, int requestCode):
参数:
activity:
permissions:应用请求的权限
requesCode:识别此权限请求的请求码
应用调用requestPermission()时,系统向用户显式一个对话框,开发者无法更改此对话框。如果开发者想要为用户解释为什么请求该权限,则应该在调用requestPermission()前进行。
示例
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
}
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}