外置SDCard(TF卡)
1. SDCard的挂载路径(根据系统不同的ROM挂载的路径不同,以下列举几个是从旧系统到新系统的表现形式)
/sdcard/external_sd
/mnt/extSdCard
/sdcard/extSdCard
/storage/sdcard1
2. 获取路径
Android获取外部SDcard的官方调用是 Environment.getExternalStorageDirectory()
但是根据不同机型,是有不同的结果的。
如果手机支持TF卡扩展,并且本身没有大容量存储,比如说HTC老款手机 G3之类的,那么获取到的是TF卡的路径。这是对的。
如果手机本身有大容量存储,不论手机是否支持TF卡扩展,比如现在HTC系列高端手机One X,或者920 butterfly系列,那么获取到的是大容量存储的路径。
也就是说,如果手机本身具有大容量存储,又支持TF卡扩展,通过这条命令是无法获取到TF卡信息的。
从系统角度编写了以下方法(不用越狱,不用权限):
try {
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("mount");
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;
String mount = new String();
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
if (line.contains("secure")) continue;
if (line.contains("asec")) continue; if (line.contains("fat")) {
String columns[] = line.split(" ");
if (columns != null && columns.length > 1) {
mount = mount.concat("*" + columns[1] + "\n");
}
} else if (line.contains("fuse")) {
String columns[] = line.split(" ");
if (columns != null && columns.length > 1) {
mount = mount.concat(columns[1] + "\n");
}
}
}
txtView.setText(mount);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
获取TF卡
内置SDCard(相对于应用,叫外部存储,应用的内部存储路径为/data)
1. 内置SDCard文件路径的挂载路径,至于有个/sdcard/这样的路径,则是指向以下真正路径的一个链接
/mnt/sdcard 或者/storage/emulated/legacy/ (Android < 4.0,根据不同的系统ROM挂载的路径不同)
/storage/sdcard0 或者/storage/emulated/0/ (Android 4.0+,根据不同的系统ROM挂载的路径不同)
2. 权限变更
Android 1.0到Android 4.0:写操作受权限WRITE_EXTERNAL_STORAGE保护,写时需加入此权限。
Android 4.1到Android 4.3:读操作也受权限READ_EXTERNAL_STORAGE保护,读时需加入此权限(写权限默认已经包括读权限了)
Android 4.3及以上:应用可以无权限访问自己的外部存储
3. 可以获取以下路径(注:"/mnt/sdcard/"字段是上面的挂载路径之一,根据Rom的不同有所不同)
Environment.getRootDirectory().getPath(): /system (系统存储)
Environment.getDataDirectory().getPath() : /data (内部存储、用户数据目录)
Environment.getDownloadCacheDirectory().getPath() : /cache (下载缓存内容目录)
Environment.getExternalStorageDirectory().getPath(): /mnt/sdcard (这个目录很可能当前不能访问,比如这个目录被用户的PC挂载,或者从设备中移除,或者其他问题发生,你可以通过getExternalStorageState()来获取当前状态)
Environment.getExternalStoragePublicDirectory(“test”): /mnt/sdcard/test (公共数据)
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES): /mnt/sdcard/Pictures
Context.getPackageName() : <your app package name>
Context.getCacheDir().getPath() : /data/data/<your app package name>/cache
Context.getFilesDir().getPath() : /data/data/<your app package name>/files (Context.openFileInput()、.openFileOutput()、.fileList()、.deleteFile(String)可进行操作)
Context.getDatabasePath(“test”).getPath() : /data/data/<your app package name>/databases/test
Context.getDir(“test”, Context.MODE_PRIVATE).getPath() : /data/data/<your app package name>/app_test (不存在则创建)
Context.getObbDir().getPath() : /mnt/sdcard/Android/obb/<your app package name>
Context.getExternalCacheDir().getPath() : /mnt/sdcard/Android/data/<your app package name>/cache
Context.getExternalFilesDir(null).getPath() = /mnt/sdcard/Android/data/<your app package name>/files (需要声明权限)
Context.getExternalFilesDir(“test”).getPath() = /mnt/sdcard/Android/data/<your app package name>/files/test(需要声明权限)
注: 对于应用,卸载后该应用的内部存储及外部存储数据都会被删除,但公共数据不会被删除。(即 /data/data/<your app package name>/c和/mnt/sdcard/Android/data/<your app package name>/下的所有数据会被删除,其它的不会被删除)
根据以上,可以这样获取Cache路径:
/**
* 获取cache目录路径
*/
public static String getDiskCachePath(Context context) {
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) {
return context.getExternalCacheDir().getPath();
} else {
return context.getCacheDir().getPath();
}
}