当前位置: 代码迷 >> Android >> Android中一些数据储存函数的封装
  详细解决方案

Android中一些数据储存函数的封装

热度:85   发布时间:2016-05-01 13:04:40.0
Android中一些数据存储函数的封装

本人博客原文

  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;
}
@Override
public 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 block
            e.printStackTrace();
        }
        isSuccess = true;
    } catch (InterruptedException e) {
    }
    isReturn = true;
}
}
}


结束


  相关解决方案