本人博客原文
Android很多手机现在都有EMMC存储(一般是2G),一些手机并没有挂载在getExternalStorageDirectory()这个节点上(该节点用于挂载外部sdcard了).而是挂载到"/mnt/emmc"节点上,另外一些手机把EMMC存储直接挂载到了
getExternalStorageDirectory()
这个节点上,而对于真正的外部sdcard挂载到了"/mnt/sdcard2"这个节点上。因此当我们存储一个文件时首先应该存在
getExternalStorageDirectory()
这个节点上,其次是"/mnt/sdcard2"这个节点上,再次是"/mnt/emmc",最后才是手机的内部存储(即“/data”区域)。 另外,在很多手机上,虽然我们使用Context的openFileOutput(FILENAME, Context.MODE_WORLD_READABLE)的方式来创建文件,而且使用ls -l看到该文件对别的应用程序来说其实已经有读的权限,但是别的应用程序实际上还是无法读取这些。这时我们需要在创建该文件的应用程序中对getFilesDir()目录执行"chmod 705"的操作来解决该问题。
我特把这些操作进行封装,以便使用。
package cn.edu.cdut.robin;import java.io.File;import java.io.IOException;import android.content.Context;import android.os.Environment;import android.os.StatFs;import android.text.TextUtils;public class AppUtil {static Context context;static void init(Context cxt) {context = cxt;}/** get external Storage available space*/public static long getExternaltStorageAvailableSpace() {if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {return 0;}File path = Environment.getExternalStorageDirectory();StatFs statfs = new StatFs(path.getPath());long blockSize = statfs.getBlockSize();long availableBlocks = statfs.getAvailableBlocks();return blockSize * availableBlocks;}/** get external Storage available space*/public static long getExternaltStorageTotalSpace() {File path = Environment.getExternalStorageDirectory();StatFs statfs = new StatFs(path.getPath());long blockSize = statfs.getBlockSize();long totalBlocks = statfs.getBlockCount();return blockSize * totalBlocks;}/** get sdcard2 external Storage available space*/public static long getSdcard2StorageAvailableSpace() {if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {return 0;}String path = getSdcard2StorageDirectory();File file = new File(path);if (!file.exists())return 0;StatFs statfs = new StatFs(path);long blockSize = statfs.getBlockSize();long availableBlocks = statfs.getAvailableBlocks();return blockSize * availableBlocks;}/** get sdcard2 external Storage total space*/public static long getSdcard2StorageTotalSpace() {String path = getSdcard2StorageDirectory();File file = new File(path);if (!file.exists())return 0;StatFs statfs = new StatFs(path);long blockSize = statfs.getBlockSize();long totalBlocks = statfs.getAvailableBlocks();return blockSize * totalBlocks;}/** get EMMC internal Storage available space */public static long getEmmcStorageAvailableSpace() {String path = getEmmcStorageDirectory();File file = new File(path);if (!file.exists())return 0;StatFs statfs = new StatFs(path);long blockSize = statfs.getBlockSize();long availableBlocks = statfs.getAvailableBlocks();return blockSize * availableBlocks;}/** get EMMC internal Storage total space */public static long getEmmcStorageTotalSpace() {String path = getEmmcStorageDirectory();File file = new File(path);if (!file.exists())return 0;StatFs statfs = new StatFs(path);long blockSize = statfs.getBlockSize();long totalBlocks = statfs.getBlockCount();return blockSize * totalBlocks;}public static long getInternalStorageAvailableSpace() {String path = getInternalStorageDirectory();StatFs stat = new StatFs(path);long blockSize = stat.getBlockSize();long availableBlocks = stat.getAvailableBlocks();return blockSize * availableBlocks;}/*** 获取手机内部总的存储空间* @return*/public static long getInternalStorageTotalSpace() {File path = Environment.getDataDirectory();StatFs stat = new StatFs(path.getPath());long blockSize = stat.getBlockSize();long totalBlocks = stat.getBlockCount();return totalBlocks * blockSize;}public final static String getExternalStorageDirectory(){return Environment.getExternalStorageDirectory() + File.separator+"";}public final static String getExternalStoragePublicDirectory(String type){return Environment.getExternalStoragePublicDirectory(type).getAbsolutePath();}public final static String getSdcard2StorageDirectory() {return "/mnt/sdcard2";}public final static String getEmmcStorageDirectory() {return "/mnt/emmc";}private static String externalStoragePrivateDirectory;static String getExternalPrivateFilesDirectory(){if(externalStoragePrivateDirectory==null)externalStoragePrivateDirectory=context.getExternalFilesDir(null).getAbsolutePath();return externalStoragePrivateDirectory;}private static String internalStorageDirectory;public final static String getInternalStorageDirectory() {if (TextUtils.isEmpty(internalStorageDirectory)) {File file = context.getFilesDir();internalStorageDirectory = file.getAbsolutePath();if (!file.exists())file.mkdirs();String shellScript = "chmod 705 " + internalStorageDirectory;runShellScriptForWait(shellScript);}return internalStorageDirectory;}public static boolean isInternalStoragePath(String path) {String rootPath = getInternalStorageDirectory();if (path != null && path.startsWith(rootPath))return true;return false;}public static String getFileName(String file) {if (file == null)return null;int index = file.lastIndexOf("/");return file.substring(index + 1);}public static boolean runShellScriptForWait(final String cmd) throws SecurityException {ShellThread thread = new ShellThread(cmd);thread.setDaemon(true);thread.start();int k = 0;while (!thread.isReturn() && k++ < 20) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}if (k >= 20) {thread.interrupt();}return thread.isSuccess();}/** 用于执行shell脚本的线程 */private static class ShellThread extends Thread {private boolean isReturn;private boolean isSuccess;private String cmd;public boolean isReturn() {return isReturn;}public boolean isSuccess() {return isSuccess;}/** @param cmd shell命令内容* @param isReturn 线程是否已经返回* @param isSuccess Process是否执行成功 */public ShellThread(String cmd) {this.cmd = cmd;}@Overridepublic void run() {try {Runtime runtime = Runtime.getRuntime();Process proc;try {proc = runtime.exec(cmd);isSuccess=(proc.waitFor()==0);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}isSuccess = true;} catch (InterruptedException e) {}isReturn = true;}}}