package com.dh.foundation.utils.filemanager; import android.content.Context; import android.os.Environment; import android.util.Log; import java.io.BufferedReader; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; /** * Created by eve on 2015/9/22. */ public class FilePathUtil { /* 图片根路径 */ public final static String getImageDirectoryPath(Context mContext) { // return "/" + mContext.getApplicationInfo().packageName +"/picture"; } /*文件路径*/ public final static String getFileDirectoryPath(Context mContext) { // return "/" + mContext.getApplicationInfo().packageName +"/files"; } /*assets文件绝对路径*/ public final static String AEESTS_ABSOLUTE_PATH = "file:///android_asset/"; /*assets文件相对路径*/ public final static String AEESTS_RELATIVE_PATH = "/assets/"; /* * 方法:getDataDirectory() 解释:返回 File ,获取 Android 数据目录。 * 方法:getDownloadCacheDirectory() 解释:返回 File ,获取 Android 下载/缓存内容目录。 * 方法:getExternalStorageDirectory() 解释:返回 File ,获取外部存储目录即 SDCard * 方法:getExternalStoragePublicDirectory(String type) 解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些类型的文件 * 方法:getExternalStorageState() 解释:返回 File ,获取外部存储设备的当前状态 * 方法:getRootDirectory() 解释:返回 File ,获取 Android 的根目录 Android的Uri由以下三部分组成: "content://"、数据的路径、标示ID(可选)   举些例子,如:     所有联系人的Uri: content://contacts/people     某个联系人的Uri: content://contacts/people/5     所有图片Uri: content://media/external     某个图片的Uri:content://media/external/images/media/4*/ /* 所有联系人的Uri*/ public final static String CONTACTS_PEOPLE_URI = "content://contacts/people"; /* 所有图片Uri*/ public final static String MEDIA_EXTERNAL_URI = "content://media/external"; // 测试外置sd卡是否卸载,不能直接判断外置sd卡是否为null,因为当外置sd卡拔出时,仍然能得到外置sd卡路径。我这种方法是按照android谷歌测试DICM的方法, // 创建一个文件,然后立即删除,看是否卸载外置sd卡 // 注意这里有一个小bug,即使外置sd卡没有卸载,但是存储空间不够大,或者文件数已至最大数,此时,也不能创建新文件。此时,统一提示用户清理sd卡吧 private static boolean checkFsWritable(String dir) { if (dir == null) return false; File directory = new File(dir); if (!directory.isDirectory()) { if (!directory.mkdirs()) { return false; } } File f = new File(directory, ".keysharetestgzc"); try { if (f.exists()) { f.delete(); } if (!f.createNewFile()) { return false; } f.delete(); return true; } catch (Exception e) { } return false; } // 返回值不带File seperater "/",如果没有外置第二个sd卡,返回null public static String getFirstExterPath() { // Log.i("TAGG","f=="+Environment.getExternalStorageDirectory().getPath()); return Environment.getExternalStorageDirectory().getPath(); } public static String getSecondExterPath() { List<String> paths = getAllExterSdcardPath(); if (paths.size() == 2) { for (String path : paths) { if (path != null && !path.equals(getFirstExterPath())) { Log.i("TAGG","s=="+path); return path; } } return null; } else { return null; } } /*获取系统目录*/ public final static String getSystemPath(Context mContext) { return "/data/data/" + mContext.getPackageName() + "/files"; } public static boolean isFirstSdcardMounted() { if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { return false; } return true; } public static boolean isSecondSDcardMounted() { // if(Environment.getStorageState(Environment.STORAGE_PATH_SD2).equals(Environment.MEDIA_MOUNTED)) // { ////为true的话,外置sd卡存在 // } String sd2 = getSecondExterPath(); if (sd2 == null) { return false; } Log.i("TAG","isSec"+checkFsWritable(sd2 + File.separator)); return checkFsWritable(sd2 + File.separator); } /* sdcard 路径*/ public static String getExtPath() { if (isSecondSDcardMounted()) return getSecondExterPath(); if (isFirstSdcardMounted()) return getFirstExterPath(); /* "/data/data/" + mContext.getPackageName() + "/files"*/ return null; } public static boolean isExistExtPath() { if (getExtPath() == null) return false; return true; } public static List<String> getAllExterSdcardPath() { List<String> SdList = new ArrayList<String>(); String firstPath = getFirstExterPath(); // 得到路径 try { Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec("mount"); InputStream is = proc.getInputStream(); InputStreamReader isr = new InputStreamReader(is); String line; BufferedReader br = new BufferedReader(isr); while ((line = br.readLine()) != null) { // 将常见的linux分区过滤掉 if (line.contains("secure")) continue; if (line.contains("asec")) continue; if (line.contains("media")) continue; if (line.contains("system") || line.contains("cache") || line.contains("sys") || line.contains("data") || line.contains("tmpfs") || line.contains("shell") || line.contains("root") || line.contains("acct") || line.contains("proc") || line.contains("misc") || line.contains("obb")) { continue; } if (line.contains("fat") || line.contains("fuse") || (line .contains("ntfs"))) { String columns[] = line.split(" "); if (columns != null && columns.length > 1) { String path = columns[1]; if (path != null && !SdList.contains(path) && path.contains("sd")) SdList.add(columns[1]); } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if (!SdList.contains(firstPath)) { SdList.add(firstPath); } return SdList; } }