之前以为在framework中不需要申请权限就可以直接使用,直到最近移植android6.0时,发现原来4.4上的代码移植到6.0上后无法正常使用,排查原因发现是在读写sdcard时因为没有读写权限导致出错,这才直到原来framework中的服务也是需要配置权限相关的东西的,只是方法和app中配置的方法不一样。如下记录该问题解决的方法:
1、测试代码
我在system server中自定义的服务中加入一段读写外置存储的测试代码,代码实现的功能非常简单,主要用三个方法构成,一个用于检测外置存储设备的挂载状态,一个用于读取显示外置存储中的文件列表,第三个方法用于向外置存储设备中创建一个测试文件,创建前如果存在就先删除。
private final static String[] sStorageArray = { "/mnt/extsd",
"/mnt/extsd2", "/mnt/usbhost/Storage01", "/mnt/usbhost/Storage02",
"/mnt/usbhost/Storage03" };
@RequiresPermission(anyOf = {"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"})
private static void checkStorageState() {
String state = Environment.getExtsdStorageState();
Log.d(TAG, "getExtsdStorageState=" + state);
state = Environment.getExtsd2StorageState();
Log.d(TAG, "getExtsd2StorageState=" + state);
state = Environment.getUsbStorageState();
Log.d(TAG, "getUsbStorageState=" + state);
state = Environment.getExtsd2StorageState();
Log.d(TAG, "getExtsd2StorageState=" + state);
}
@RequiresPermission(anyOf = {"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"})
private static void listFile(final String home) {
Log.d(TAG, "Home ="+home);
File f = new File(home);
if (null != f && f.exists()) {
Log.d(TAG, "Home " + home + " is avaiable!");
File list[] = f.listFiles();
if (null != list && 0 < list.length) {
Log.d(TAG, "File list is not empty.");
for (File tf : list) {
if (null != tf) {
Log.d(TAG, "File name=" + tf.getName());
}
}
}
else {
Log.e(TAG, "File list is empty.");
}
} else {
Log.e(TAG, "Home " + home + " is not avaiable.");
}
}
@RequiresPermission(anyOf = {"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"})
private static void writeFile(final String home) {
Log.d(TAG, "Home ="+home);
File f = new File(home);
if (null != f && f.exists()) {
Log.d(TAG, "Home " + home + " is avaiable!");
fin