我无法证实,我不得不从本书正确的答案,但这里是我自己的那本书的解释,因为它涉及到你的问题。任何人,请随时纠正我的解释。我不假装知道答案是肯定的。希望我自己对这个权限系统的理解能够帮助你找到代码工作的正确位置,因为我还没有找到这个部分。
我相信这些类型的权限都是在Linux文件组标识权限级别透明处理的。 Android本质上是一个操作系统,它正在使用另一个操作系统。
在Android中,首先被安装在系统相机时,Linux分配它自己的用户ID,与自己的主目录以来,它得到的东西列出叫服务管理(不要与更高级别的Android困惑服务是完全不同的),并且它还得到一个组ID(一个组ID代表可能有多个摄像头的入口点:前置摄像头,后置摄像头,以及第二个后置摄像头,以防您拥有3-D手机) 。该组ID(gid)基本上是一个整数,它在安装时从表示摄像头权限的字符串常量中映射出来。
在Linux中,每个应用程序都是一个用户,每个应用程序也是一个目录,而且在Linux中,一切都是文件,甚至空目录是文件,设备是文件,甚至io都可以是文件。
这里是我相信事情有点反直觉的地方。使用Linux,每个用户应用程序都有自己的空白沙箱,可以运行自己的进程。而在Linux中,Binder使用权限本身来访问相关系统应用程序的句柄,并将其与您的应用程序绑定。因此,如果没有系统应用程序的处理以及随之而来的所有可能的环境变量,那么您自己的应用程序根本无法知道如何在沙箱外运行任何程序。这就像编写一个程序并忽略相关的进口声明。
这就是为什么在Android中,当您遗漏了您正在使用的函数的权限时,系统并不直接告诉您“您没有权限执行此操作”。该系统甚至不知道那么多。系统只知道你试图运行一些无法找到/访问的东西(无论出于何种原因,它可能只是源文件中的一个拼写错误)。所以大多数情况下,当你忘记包含许可时,系统会给你一个很大的困惑,就像你一直在说火星一样。
最近,Android开发工具创建者已经越来越好地向我们提示我们可能忘记了包含特定权限。忘记许可是一件容易犯的错误,特别是在初学者中。使用正确的IDE /工具链自动化工具,这是一个可以永久消失的错误。