正在进行一些Android权限研究并运行一个应用程序 - 根据AndroidManifest.xml文件 - 仅声明WRITE_EXTERNAL_STORAGE
作为权限。 Android Market也只报告此情况。使用aapt工具转储uses-permission,它也只报告一个权限。
但是,在Android设备(或模拟器)上运行的代码中,执行以下操作:
PackageManager pm = getPackageManager();
List<PackageInfo> pkgList = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS | PackageManager.GET_SIGNATURES);
...
PackageInfo p = pkgList.get(i); // where i is the index of the apk in question
String[] perms = p.requestedPermissions;
我获得了此APK,READ_PHONE_STATE
和清单中WRITE_EXTERNAL_STORAGE
的权限。查看“管理应用”屏幕并为其选择详细信息还会显示额外的READ_PHONE_STATE
权限。
在Android Manifest中不需要权限的情况下(在代码中,通过feature use等)隐含权限吗?或者换句话说,为什么aapt
会返回一组权限而getPackageManager().getPackageInfo()
API会返回另一组权限?
编辑:
使用“更好”字词搜索发现了我正在寻找的答案:Android permissions: Phone Calls: read phone state and identity
简而言之,使用早期版本的SDK编译的APK确实继承了免费的一些权限......
答案 0 :(得分:1)
据我所知,必须始终在清单中明确设置权限。
如果应用程序需要访问受权限保护的功能,则必须声明它需要具有清单中元素的权限。然后,当应用程序安装在设备上时,安装程序通过检查签署应用程序证书的权限并在某些情况下询问用户来确定是否授予所请求的权限。如果授予了权限,则应用程序可以使用受保护的功能。如果没有,它访问这些功能的尝试将在没有任何通知用户的情况下失败。
您认为我认为差异是由于权限的protectionLevel属性造成的。设置为“正常”的任何权限都不需要用户确定,因此它们只显示在“详细信息”部分中。