一、为什么需要权限申请
Android 操作系统为了保障手机用户的隐私和安全,对于手机上的一些敏感操作和个人信息,比如电话、短信记录,相机、麦克风等设备的使用,需要向用户申请权限。每个应用需要使用的权限种类和申请数量可能不同,但是确保用户同意了应用使用的权限才可以使用,否则应用无法运行或功能受限。
为了提供更好的用户体验和系统性能,系统提供了权限管理功能,用户可以在权限管理中查看应用当前申请的权限,并根据需要授予或者拒绝应用申请的权限。
二、Android 权限种类
Android 权限分为三种:
- Normal permissions:属于正常级别的权限,当应用申请此类权限时,系统会自动授予,无需用户同意。
- Dangerous permissions:属于危险级别的权限,当应用申请此类权限时,系统会提示用户授权。如果用户拒绝授权,应用的相应功能将被限制。
- Signature permissions:只有在应用具有相应签名的情况下,才可以使用的权限。如果应用未经授权或签名不正确,系统不会授权此类权限。
三、权限申请的流程
权限申请的流程分为以下几个步骤:
- 在 Manifest 文件中声明应用需要申请的权限。
- 检查应用需要申请的权限是否已被授权。
- 如果未被授权,则向用户请求授权。
- 在用户授权后,根据获取权限的结果执行相应操作。
四、权限申请的示例代码
1、在 Manifest 文件中声明需要申请的权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest>
2、检查权限是否已被授权
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 权限未被授权,向用户申请授权 } else { // 权限已被授权,执行相应操作 }
3、向用户请求授权
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) { // 如果应用之前请求过此权限但是用户拒绝了,可以向用户解释为什么需要此权限并再次请求授权 } else { // 申请权限,requestCode 可以是任意值,在结果回调时会返回此值 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, requestCode); }
4、获取权限结果并执行相应操作
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == CAMERA_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户授权了相机权限,执行相应操作 } else { // 用户拒绝了相机权限,应用相应策略 } } }
五、注意事项
在申请权限时,需要注意以下几点:
- 在应用中让用户清晰地知道为什么需要此权限。
- 在用户拒绝授权时,应能够 gracefully 的处理,如提供手动设置权限、给予提示等方式。
- 在 Android 6.0 及以上版本中申请权限时,应该实现动态申请权限,同时也要保证兼容 Android 5.1 及以下版本,以便应用在更多设备上运行。