在 Android 应用中,权限是指应用所需要的访问设备上某种资源或执行某些操作的能力。例如,访问照片库、发送短信、获取设备位置等。每个应用都需要在 Android 的清单文件中声明它所需要的权限。当用户安装应用程序时,系统将显示所有权限,并且需要用户批准这些权限。
当用户授予权限时,应用程序就可以访问特定的设备资源并执行特定的操作。然而,如果应用程序要获得更多的权限,则需要我们使用 `AndroidManifest.xml` 文件进行声明。
以下是如何声明一个权限:
```xml
```
这将表示声明应用程序需要读取外部存储器(例如SD卡)的权限。类似的声明可以添加多个,使应用程序具有更多的功能。
在 Android 中,权限分为两种:normal 和 dangerous。
normal 权限是指对用户隐私影响较小的权限,Android 系统会自动授予,而不需要用户进行确认。而 dangerous 权限是指需要用户明确授权才能使用的敏感权限,例如读取设备位置、读取系统日历等。
如果应用程序需要dangerous权限,则必须在运行时请求用户的许可才能访问此权限。
以下是如何判断应用程序是否存在指定的权限:
```java
int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
```
在此,`permissionCheck` 变量将具有以下两个值之一:
- `PackageManager.PERMISSION_GRANTED`:表示已授予权限。
- `PackageManager.PERMISSION_DENIED`:表示未授予权限。
如果应用程序请求的权限未被授予,则需要应用程序请求用户授权:
```java
if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
ActivityCompat.requestPermissions(MainActivity.this,new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, requestCode);
}
```
这将显示一个对话框,请求用户授权,等待用户做出选择。在用户做出选择后,回调函数 onRequestPermissionsResult() 将被触发。
```java
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 被用户授予权限
} else {
// 权限被拒绝了
}
break;
}
}
```
以上是 Android app 权限的原理以及详细介绍,希望对你有所帮助。