Android权限等级划分为:
- normal 的权限只要申请了就可以使用
- dangerous 的权限在安装时需要用户确认才可以使用
- signature需要签名才能赋予权限
- signatureOrSystem需要签名或者系统级应用(放置在/system/priv-app目录下)才能赋予权限
- system系统级应用(放置在/system/priv-app目录下)才能赋予权限,权限的描述在frameworks/base/core/res/AndroidManifest.xml当中。
看两个权限:
WRITE_EXTERNAL_STORAGE : 读写主卡的权限
WRITE_MEDIA_STORAGE:读写副卡的权限
到了Android 4.4 KitKat,WRITE_MEDIA_STORAGE 权限仅提供给系统应用,不再授予第三方App。
WRITE_EXTERNAL_STORAGE 权限变成了仅仅控制 primary storage,而 WRITE_MEDIA_STORAGE 权限来控制secondary external storage 的操作。
关于 secondary external storage写操作也有了新规定。
Android的文档是这么写的:
The WRITE_EXTERNAL_STORAGE permission must only grant write access to the primary external storage on a device. Apps must not be allowed to write to secondary external storage devices, except in their package-specific directories as allowed by synthesized permissions. Restricting writes in this way ensures the system can clean up files when applications are uninstalled.
如果App使用System Level的permission,需要预置到/system/priv-app底下 (原来在/system/app)或者使用系统签名
关于获取副SD卡的写入权限的案例,App需要在AndroidManifest.xml声明WRITE_MEDIA_STORAGE permission获取副卡的写入权限
已知android.permission.WRITE_MEDIA_STORAGE属于SystemOrSignature level的permission
那么有三种方法:
1. 修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以声明app需要放在/system/priv-app下。
2. 在manifest文件中声明,android:sharedUserId=”android.uid.system”,然后签上系统签名platform.x509.pem和platform.pk8在工程目录/build/target/product/security中,注意源代码里面的只是一个debug版本的key,非正式版。
3. 同样在manifest文件中声明android:sharedUserId=”android.uid.system”然后mk文件中添加LOCAL_CERTIFICATE := platform,启用系统签名,与2意思差不多。