這兩種配置對SDCARD的權(quán)限控制是不一樣的。
合并分區(qū):按照谷歌4.4的要求,把sdcard,U盤等外部存儲器的權(quán)限設(shè)置為uid= AID_SYSTEM gid=AID_MEDIA_RW,mask是0002.。 這樣就要求要對sdcard等有寫權(quán)限必須要持有這個(gè)permission。
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
這個(gè)permission對應(yīng)的group信息是在frameworks/base/data/etc/platform.xml 中定義的
<permission name="android.permission.WRITE_MEDIA_STORAGE" >
<group gid="media_rw" />
</permission>
這個(gè)permission是4.4中新增的,并且是不推薦使用的。
非合并分區(qū):為了方便使用并且兼容4.2之前的APK,我們把sdcard,u盤的權(quán)限設(shè)置為uid= AID_SYSTEM gid=AID_SDCARD_RW,mask是0002.。 這樣就要求要對sdcard等有寫權(quán)限必須要持有
這個(gè)permission對應(yīng)的group信息是在frameworks/base/data/etc/platform.xml 中定義的
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
這個(gè)permission是4.2之前就開始使用的,大家都比較熟悉。
修改方法:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_r" />
<group gid="sdcard_rw" />
</permission>
其他方案上使用了如下方法繞過這個(gè)問題,但是我是不建議使用的
就是在frameworks/base/data/etc/platform.xml 中作如下修改
即把WRITE_MEDIA_STORAGE這個(gè)permission對應(yīng)的group也賦值到WRITE_EXTERNAL_STORAGE這個(gè)權(quán)限中,也即是說WRITE_MEDIA_STORAGE這個(gè)權(quán)限的控制效果失效了。
注意:這個(gè)permission要求使用platform簽名即在Android.mk中要增加如下:
+LOCAL_CERTIFICATE := platform
這樣修改之后GMS包中的APK,以及第三方的APK就可以刪除sdcard中的文件了。但是Android系統(tǒng)中對openOutputStream還是有限制的,不允許用openOutputStream 保存文件到非主存儲器上。
現(xiàn)象是:GMS包中的Photo這個(gè)APK不能保存編輯過的sdcard中的圖片。
修改方法如下:
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -4787,10 +4787,10 @@ public class MediaProvider extends ContentProvider {
c.enforceCallingOrSelfPermission(
ACCESS_CACHE_FILESYSTEM, "Cache path: " + path);
}
- } else if (isWrite) {
+ }/* else if (isWrite) {
// don't write to non-cache, non-sdcard files.
throw new FileNotFoundException("Can't access " + file);
- } else if (isSecondaryExternalPath(path)) {
+ } */else if (isSecondaryExternalPath(path)) {
// read access is OK with the appropriate permission
if (!readGranted) {
c.enforceCallingOrSelfPermission(