1、Android 是一个权限分隔的操作系统,其中每个应用都有其独特的系统标识(Linux 用户 ID 和组 ID)。
在安装时,Android 为每个软件包提供唯一的 Linux 用户 ID。
由于在进程级实施安全性,因此任何两个软件包的代码通常都不能在同一进程中运行,因为它们需要作为不同的 Linux 用户运行。您可以在每个软件包的 AndroidManifest.xml 的 manifest 标记中使用 sharedUserId 属性,为它们分配相同的用户 ID。这样做以后,两个软件包将被视为同一个应用,具有相同的用户 ID 和文件权限。
2、应用存储的任何数据都会被分配该应用的用户ID,并且其他软件包通常无法访问这些数据。使用 getSharedPreferences(String, int)、openFileOutput(String,int) 或 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) 创建新文件时,可以使用MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 标记允许任何其他软件包读取/写入文件。
3、添加权限:将<uses-permission> 元素置于应用清单manifest中,作为顶级 <manifest> 元素的子项。
4、系统权限分为两类:正常权限和危险权限:
正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
危险权限会授予应用访问用户机密数据的权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限(参见5)。
5、如果设备运行的是 Android 5.1或更低版本,或者应用的目标 SDK 为 22 或更低:如果应用在manifest中列出了危险权限,则用户必须在安装应用时授予此权限;如果他们不授予此权限,系统根本不会安装应用。
如果设备运行的是 Android 6.0 或更高版本,或者应用的目标 SDK 为 23 或更高:如果应用在manifest中列出了危险权限,则它必须在运行时请求其需要的每项危险权限。用户可以授予或拒绝每项权限,且即使用户拒绝权限请求,应用仍可以继续运行有限的功能。
6、检查权限:ContextCompat.checkSelfPermission(,):
Context.checkCallingPermission (Stringpermission):检查调用该方法的进程是否有该权限;
Context.checkPermission (String permission,int pid, int uid):检查系统中特定的pid,uid是否有该权限;
PackageManager.checkPermission (StringpermName, String pkgName):检查特定的包是否有该权限;
以上检查权限的方法返回一个int,如果应用具有此权限,那么方法将返回 PackageManager.PERMISSION_GRANTED,如果应用不具有此权限,那么方法将返回PERMISSION_DENIED。
7、权限请求及响应
如果应用尚无所需的权限,则应用必须调用一个 requestPermissions() 方法,以请求适当的权限。
申请权限:ActivityCompat.requestPermissions( thisActivity, new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);
当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应。因此应用程序必须实现onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)方法。
8、自动权限调整:Android 将根据为targetSdkVersion 属性提供的值决定应用是否需要权限。如果该值低于在其中添加权限的版本,则 Android 会自动添加该权限。9、权限组:如果设备运行的是 Android6.0(API 级别 23),并且应用的 targetSdkVersion 是 23 或更高版本,则当用户请求危险权限时,系统显示的对话框说明了您的应用需要访问的权限组,它不会列出具体权限。用户只需要为每个权限组授予一次权限。
10、此外,可以在所需的组件上使用android:permission 属性,限制访问系统或应用的全部组件。
Activity 权限(应用于<activity> 标记)限制谁可以启动相关的 Activity。
Service 权限(应用于<service> 标记)限制谁可以启动或绑定到相关的服务。
BroadcastReceiver 权限(应用于<receiver> 标记)限制谁可以发送广播给相关的接收方。
ContentProvider 权限(应用于<provider> 标记)限制谁可以访问 ContentProvider 中的数据。
11、自定义权限:在AndroidManifest.xml中使用一个或多个<permission> 元素声明,可在组件上使用自定义权限。