Android获取可存储文件所有路径
引言:大家在做app开发的时候,基本都会保存文件到手机,android存储文件的地方有很多,不像ios一样,只能把文件存储到当前app目录下,并且android手机由于厂家定制了rom,sdcard的路径在不同手机上都会不一样.我这边封装了获取路径的几个方法,放在一个工具类里面.
1.获取扩展存储设备
2.获取sdcard2外部存储空间
3.获取可用的 EMMC 内部存储空间
4.获取其他外部存储可用空间
5.获取内部存储目录
Activity 程序的入口,在oncreate方法里面通过工具类获取文件保存路径,并且打印出来.(还写了一个创建指定大小空文件的方法,有需要的可以调用)
/**
* 获取存储路径,并且打印出来
* @author ansen
* @create time 2015-09-07
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); String str=FileUtil.getCachePath();
// writeFileSize(str+"/ansen.mp3",50); //在当前目录下创建ansen.mp3文件 文件长度50兆
System.out.println(str);
} /**
* 创建指定大小的文件.写入空数据
* @param filePath 文件路径
* @param size 文件长度 单位是兆
*/
private void writeFileSize(String filePath,int size){
try {
RandomAccessFile raf = new RandomAccessFile(filePath,"rw");
raf.seek(raf.length());//每次从文件末尾写入
for (int i = 0; i < size; i++) {//一共写入260兆,想写多大的文件改变这个值就行
byte[] buffer = new byte[1024*1024]; //1次1M,这样内存开的大一些,又不是特别大。
raf.write(buffer);
System.out.println("写入1兆..."+i);
}
raf.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
文件工具类 封装了一个公共方法,获取文件保存路径,一共可以获取5个路径,依次判断5个路径预留空间是否大于50兆.大于就直接返回路径
/**
* 文件工具类
* @author ansen
* @create time 2015-09-07
*/
public final class FileUtil {
private static final String FOLDER_NAME = "ansen";//这里可以换成你的app名称
private static final long MIN_STORAGE=52428800;//50*1024*1024最低50m //缓存路径
public static String getCachePath(){
String path = getSavePath(MIN_STORAGE);
if(TextUtils.isEmpty(path)){
return null;
}
path= path + FOLDER_NAME + "/cache";
makeDir(path);
return path;
} /**
* 获取保存文件路径
* @param saveSize 预留空间
* @return 文件路径
*/
private static String getSavePath(long saveSize) {
String savePath = null;
if (StorageUtil.getExternaltStorageAvailableSpace() > saveSize) {//扩展存储设备>预留空间
savePath = StorageUtil.getExternalStorageDirectory();
File saveFile = new File(savePath);
if (!saveFile.exists()) {
saveFile.mkdirs();
} else if (!saveFile.isDirectory()) {
saveFile.delete();
saveFile.mkdirs();
}
} else if (StorageUtil.getSdcard2StorageAvailableSpace() > saveSize) {//sdcard2外部存储空间>预留空间
savePath = StorageUtil.getSdcard2StorageDirectory();
File saveFile = new File(savePath);
if (!saveFile.exists()) {
saveFile.mkdirs();
} else if (!saveFile.isDirectory()) {
saveFile.delete();
saveFile.mkdirs();
}
} else if (StorageUtil.getEmmcStorageAvailableSpace() > saveSize) {//可用的 EMMC 内部存储空间>预留空间
savePath = StorageUtil.getEmmcStorageDirectory();
File saveFile = new File(savePath);
if (!saveFile.exists()) {
saveFile.mkdirs();
} else if (!saveFile.isDirectory()) {
saveFile.delete();
saveFile.mkdirs();
}
} else if (StorageUtil.getOtherExternaltStorageAvailableSpace()>saveSize) {//其他外部存储可用空间>预留空间
savePath = StorageUtil.getOtherExternalStorageDirectory();
File saveFile = new File(savePath);
if (!saveFile.exists()) {
saveFile.mkdirs();
} else if (!saveFile.isDirectory()) {
saveFile.delete();
saveFile.mkdirs();
}
}else if (StorageUtil.getInternalStorageAvailableSpace() > saveSize) {//内部存储目录>预留空间
savePath = StorageUtil.getInternalStorageDirectory() + File.separator;
}
return savePath;
} /**
* 创建文件夹
* @param path
*/
private static void makeDir(String path){
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
file = null;
}
}
封装了获取各种路径的一些方法,供FileUtil类调用.
/**
* 封装了获取文件路径的一些方法
* @author ansen
* @create time 2015-09-07
*/
@SuppressLint("NewApi")
public final class StorageUtil {
private static String otherExternalStorageDirectory = null;
private static int kOtherExternalStorageStateUnknow = -1;
private static int kOtherExternalStorageStateUnable = 0;
private static int kOtherExternalStorageStateIdle = 1;
private static int otherExternalStorageState = kOtherExternalStorageStateUnknow;
private static String internalStorageDirectory; public static Context context; public 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;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
blockSize = statfs.getBlockSizeLong();
}else {
blockSize = statfs.getBlockSize();
} long availableBlocks;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
availableBlocks = statfs.getAvailableBlocksLong();
}else {
availableBlocks = statfs.getAvailableBlocks();
}
return blockSize * availableBlocks;
} 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 long getInternalStorageAvailableSpace() {
String path = getInternalStorageDirectory();
StatFs stat = new StatFs(path);
// long blockSize = stat.getBlockSizeLong();
long blockSize;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
blockSize = stat.getBlockSizeLong();
}else {
blockSize = stat.getBlockSize();
}
// long availableBlocks = stat.getAvailableBlocksLong();
long availableBlocks;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
availableBlocks = stat.getAvailableBlocksLong();
}else {
availableBlocks = stat.getAvailableBlocks();
} return blockSize * availableBlocks;
} public final static String getExternalStorageDirectory() {
return Environment.getExternalStorageDirectory() + File.separator + "";
} /** 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.getBlockSizeLong();
long blockSize;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
blockSize = statfs.getBlockSizeLong();
}else {
blockSize = statfs.getBlockSize();
} // long availableBlocks = statfs.getAvailableBlocksLong();
long availableBlocks;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
availableBlocks = statfs.getAvailableBlocksLong();
}else {
availableBlocks = statfs.getAvailableBlocks();
} return blockSize * availableBlocks;
} public final static String getSdcard2StorageDirectory() {
return "/mnt/sdcard2/";
} 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) {
// TODO Auto-generated catch block
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) {
e.printStackTrace();
}
isSuccess = true;
} catch (InterruptedException e) {
}
isReturn = true;
}
} /** 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.getBlockSizeLong();
long blockSize;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
blockSize = statfs.getBlockSizeLong();
}else {
blockSize = statfs.getBlockSize();
} // long availableBlocks = statfs.getAvailableBlocksLong();
long availableBlocks;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
availableBlocks = statfs.getAvailableBlocksLong();
}else {
availableBlocks = statfs.getAvailableBlocks();
} return blockSize * availableBlocks;
} public final static String getEmmcStorageDirectory() {
return "/mnt/emmc/";
} /** get other external Storage available space */
public static long getOtherExternaltStorageAvailableSpace() {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return 0;
}
if (otherExternalStorageState == kOtherExternalStorageStateUnable)
return 0;
if (otherExternalStorageDirectory == null) {
getOtherExternalStorageDirectory();
}
if (otherExternalStorageDirectory == null)
return 0;
StatFs statfs = new StatFs(otherExternalStorageDirectory);
// long blockSize = statfs.getBlockSizeLong();
long blockSize;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
blockSize = statfs.getBlockSizeLong();
}else {
blockSize = statfs.getBlockSize();
}
// long availableBlocks = statfs.getAvailableBlocksLong();
long availableBlocks;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
availableBlocks = statfs.getAvailableBlocksLong();
}else {
availableBlocks = statfs.getAvailableBlocks();
}
return blockSize * availableBlocks;
} public static String getOtherExternalStorageDirectory() {
if (otherExternalStorageState == kOtherExternalStorageStateUnable)
return null;
if (otherExternalStorageState == kOtherExternalStorageStateUnknow) {
FstabReader fsReader = new FstabReader();
if (fsReader.size() <= 0) {
otherExternalStorageState = kOtherExternalStorageStateUnable;
return null;
}
List<StorageInfo> storages = fsReader.getStorages();
/* 对于可用空间小于100M的挂载节点忽略掉 */
long availableSpace = 100 << (20);
String path = null;
for (int i = 0; i < storages.size(); i++) {
StorageInfo info = storages.get(i);
if (info.getAvailableSpace() > availableSpace) {
availableSpace = info.getAvailableSpace();
path = info.getPath();
}
}
otherExternalStorageDirectory = path;
if (otherExternalStorageDirectory != null) {
otherExternalStorageState = kOtherExternalStorageStateIdle;
} else {
otherExternalStorageState = kOtherExternalStorageStateUnable;
}
if(!TextUtils.isEmpty(otherExternalStorageDirectory)){
if(!otherExternalStorageDirectory.endsWith("/")){
otherExternalStorageDirectory=otherExternalStorageDirectory+"/";
}
}
}
return otherExternalStorageDirectory;
} public static class FstabReader {
public FstabReader() {
init();
} public int size() {
return storages == null ? 0 : storages.size();
} public List<StorageInfo> getStorages() {
return storages;
} final List<StorageInfo> storages = new ArrayList<StorageInfo>(); public void init() {
File file = new File("/system/etc/vold.fstab");
if (file.exists()) {
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(file);
if (fr != null) {
br = new BufferedReader(fr);
String s = br.readLine();
while (s != null) {
if (s.startsWith("dev_mount")) {
/* "\s"转义符匹配的内容有:半/全角空格 */
String[] tokens = s.split("\\s");
String path = tokens[2]; // mount_point
StatFs stat = new StatFs(path); long blockSize;
long totalBlocks;
long availableBlocks;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
blockSize = stat.getBlockSizeLong();
}else {
blockSize = stat.getBlockSize();
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
totalBlocks = stat.getBlockCountLong();
}else {
totalBlocks = stat.getBlockCount();
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
availableBlocks = stat.getAvailableBlocksLong();
}else {
availableBlocks = stat.getAvailableBlocks();
} // if (null != stat&& stat.getAvailableBlocksLong() > 0) {
//
// long availableSpace = stat.getAvailableBlocksLong()* stat.getBlockSizeLong();
// long totalSpace = stat.getBlockCountLong()* stat.getBlockSizeLong();
if (null != stat&& availableBlocks > 0) { long availableSpace = availableBlocks* blockSize;
long totalSpace = totalBlocks* blockSize;
StorageInfo storage = new StorageInfo(path,
availableSpace, totalSpace);
storages.add(storage);
}
}
s = br.readLine();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fr != null)
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (br != null)
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
} static class StorageInfo implements Comparable<StorageInfo> {
private String path;
private long availableSpace;
private long totalSpace; StorageInfo(String path, long availableSpace, long totalSpace) {
this.path = path;
this.availableSpace = availableSpace;
this.totalSpace = totalSpace;
} @Override
public int compareTo(StorageInfo another) {
if (null == another)
return 1; return this.totalSpace - another.totalSpace > 0 ? 1 : -1;
} long getAvailableSpace() {
return availableSpace;
} long getTotalSpace() {
return totalSpace;
} String getPath() {
return path;
}
} }
最后记得在AndroidManifest.xml中配置读写sdcard权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
Android获取可存储文件所有路径的更多相关文章
- Android获取系统外置存储卡路径的方法
android系统可通过Environment.getExternalStorageDirectory()获取存储卡的路径.可是如今有非常多手机内置有一个存储空间.同一时候还支持外置sd卡插入,这样通 ...
- Android获取全部存储卡挂载路径
近期因项目需求.须要在存储卡查找文件,经測试发现部分手机挂载路径查找不到,这里分享一个有效的方法. /** * 获取全部存储卡挂载路径 * @return */ public static List& ...
- Android app中存储文件的路径
// 获得缓存文件路径,磁盘空间不足或清除缓存时数据会被删掉,一般存放一些临时文件 // /data/data/<application package>/cache目录 File cac ...
- Android 获取assets的绝对路径
第一种方法: String path = "file:///android_asset/文件名"; 第二种方法: InputStream abpath = get ...
- Android获取内置sdcard跟外置sdcard路径
Android获取内置sdcard跟外置sdcard路径.(测试过两个手机,亲测可用) 1.先得到外置sdcard路径,这个接口是系统提供的标准接口. 2.得到上一级文件夹目录 3.得到该目录的所有文 ...
- android开发之——获取相册图片和路径
Android开发获取相册图片的方式网上有很多种,这里说一个Android4.4后的方法,因为版本越高,一些老的api就会被弃用,新的api和老的api不兼容,导致出现很多问题. 比如:managed ...
- Android 获取SD卡路径和推断SD卡是否存在
android获取sd卡路径方法: 不建议直接写死android sd卡的路径. public String getSDPath(){ File sdDir = null; boolean sdCar ...
- Android 获取SD路径,存储空间大小的方法
Android用 Environment.getExternalStorageDirectory() 方法获取 SD 卡的路径 , 卡存储空间大小及已占用空间获取方法 : /* 获取存储卡路径 */ ...
- android获取内置和外置SD卡路径 - z
本文将介绍Android真机环境下如何获取内置和外置SD卡路径. 测试环境:三星Note3,其他手机待测试... 所需权限(AndroidManifest.xml文件里) <uses-permi ...
随机推荐
- Thinkphp3.2.3 执行query命令 包括在模板中使用<php> </php>时 query的使用方法
$sql="select * from `rjshop_productbase` where `id`=1"; $Model =M();$query=$Model->quer ...
- WPF上传文件到服务器
利用WebClient 上传文件到服务器 创建一个空网站,创建一个UploadFile.aspx项, 服务器报500错误:检查文件保存路径是否存在,检查文件大小限制 protected void Pa ...
- php 搜索(查询)功能
今天遇到一个问题:在做“搜索”功能时,输入查询条件后查询不了. 我做的是首页显示数据表package中的内容,但是有个条件,显示在首页的内容还必须是 :字段status=0,且printing=0的数 ...
- json相关的一些用法
一. json可以表示3种类型的值: 简单值 . 对象. 数组 表示对象时:>1. 没有变量的概念 ,所以不用申明变量 >2. 没有末尾结束 ...
- python使用总结
近来公司的测试部门要我们开发,按他们给我测试案例,写vba脚本,方便他们做自动化测试,老大把这事交给了我做.之前没写过vba,很多API都不会用,边写边谷歌,写得很慢. 我记得测试第一次做的是打开关闭 ...
- [ios]利用alertView 插入数据都数据库。笔记
利用alertView 插入数据都数据库 -(void)addItemToList { UIAlertView *alter=[[UIAlertViewalloc]initWithTitle:@&qu ...
- xss其他标签下的js用法总结大全
前段时间我遇到一个问题,就是说普通的平台获取cookie的语句为↓ Default <script src=js地址></script> 1 <scr ...
- Zero Copy I: User-Mode Perspective
By now almost everyone has heard of so-called zero-copy functionality under Linux, but I often run i ...
- Finger Trees: A Simple General-purpose Data Structure
http://staff.city.ac.uk/~ross/papers/FingerTree.html Summary We present 2-3 finger trees, a function ...
- 《.NET之美》消息及勘误
<.NET之美>消息及勘误 编辑最终还是采用了<.NET之美>作为书名,尽管我一直觉得这个名字有点文艺了,而更倾向于使用<.NET专题解析>这个名称. 目前已经可以 ...