在android6.0 以上如果想访问外置SDCARD,需要再申请如下权限:
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
该权限在frameworks/base/data/etc/platform.xml 定义如下:
<permission name="android.permission.WRITE_MEDIA_STORAGE" >
<group gid="media_rw" />
<group gid="sdcard_rw" />
</permission>
而该文件中 <permission name="android.permission.READ_EXTERNAL_STORAGE" /> 权限不能对外置SDCARD进行读写操作,如果强行加上 <group gid="media_rw" /> <group gid="sdcard_rw" /> 会导致不能开机(android8.1已测试)!
如果想申请WRITE_MEDIA_STORAGE权限,需要在所写APP的Android.mk中具有如下限制:
LOCAL_CERTIFICATE := platform(平台签名)
LOCAL_PRIVILEGED_MODULE := true(编译到system/priv-app目录)
同时如果想把文件存储到外置SDCARD,还需要引用
LOCAL_JAVA_LIBRARIES += mediatek-framework
使用vendor/mediatek/proprietary/frameworks/base/core/java/com/mediatek/storage/StorageManagerEx.java的
getDefaultPath()来获取用户所选择的的存储是内置存储还是外置SDCARD
/**
* Returns default path for writing.
* @hide
* @internal
*/
public static String getDefaultPath() {
String path = STORAGE_PATH_SD1;
boolean deviceTablet = false;
boolean supportMultiUsers = false;
path = SystemProperties.get(PROP_SD_DEFAULT_PATH, path); //先判斷外置SDCARD
Log.i(TAG,"StorageManagerEx::getDefaultPath...path1:"+path);
if(path.equals("")){
path = Environment.getExternalStorageDirectory().getAbsolutePath(); //如果外置SDCARD為空,則獲取內置SDCARD
}
Log.i(TAG, " Default path taken as primary storage, path=" + path);
//@ }
return path;
}