Android 多内存卡获取 外部内存卡路径

android获取内部外部存储空间,有需要的朋友可以参考下

Environment.getDataDirectory() = /data
Environment.getDownloadCacheDirectory() = /cache
Environment.getExternalStorageDirectory() = /mnt/sdcard
Environment.getRootDirectory() = /system
context.getCacheDir() = /data/data/com.mt.mtpp/cache
context.getExternalCacheDir() = /mnt/sdcard/Android/data/com.mt.mtpp/cache
context.getFilesDir() = /data/data/com.mt.mtpp/files

android系统自从升级到2.3以后,多一个功能,可以判断存储卡是否是可以卸载的。Environment.isExternalStorageRemovable(),通过此方法我们可以知道手机上的存储卡是手机自带的还是外边可插拔的SD卡,当然此种情况是指只有一个卡的情况。
但是现在国内的大多数手机都支持双存储卡:
1、即手机内置的有2G、4G或8G的内部存储卡,默认安装的应用与数据都会到这个卡中,用户不买可插拔的SD卡,也可使用。
2、手机的存储空间毕竟有限,所以手机也支持外置的SD卡,或者叫TF卡、扩展卡等。
那么这时候问题就来了,在程序中我们如何可以判断哪个路径对应的是内置存储卡,哪个对应的是外置存储卡。有人说用Environment.getExternalStorageDirectory()方法得到不就是SD卡吗,这种方法明显不适用的,尤其在4.0以后。
恰恰相反,使用上面的方法得到的大多数是手机内部对应的SD卡(/mnt/sdcard 4.1系统以下,4.1直接变为/storage/sdcard0),下面我总结了一些较常见的外部SD卡的路径:
/mnt/sdcard2 /mnt/sdcard-ext /mnt/ext_sdcard /mnt/sdcard/SD_CARD
/mnt/sdcard/extra_sd /mnt/extrasd_bind /mnt/sdcard/ext_sd
/mnt/sdcard/external_SD /storage/sdcard1 /storage/extSdCard
如何直接取,而不是hardcode来定死呢,用这个方法getVolumePaths,通过反射机制得到路径,然后判断即可。

代码如下:

package com.example.secsdcard;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.Activity;
import android.os.storage.StorageManager;

public class StorageList {

private Activity mActivity;
private StorageManager mStorageManager;
private Method mMethodGetPaths;

public StorageList(Activity activity) {
mActivity = activity;
if (mActivity != null) {
mStorageManager = (StorageManager)mActivity
.getSystemService(Activity.STORAGE_SERVICE);
try {
mMethodGetPaths = mStorageManager.getClass()
.getMethod("getVolumePaths");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}

public String[] getVolumePaths() {
String[] paths = null;
try {
paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return paths;
}
}

然后Activity通过调用

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
list = new StorageList(this);
TextView textView = new TextView(this);

if (list.getVolumePaths()[0].equals(Environment.MEDIA_MOUNTED)) {
textView.setText("有外部存储卡"+list.getVolumePaths()[0]);
} else {
textView.setText("有外部存储卡"+list.getVolumePaths()[1]);
}

// textView.setText(list.getVolumePaths()[0].toString()+list.getVolumePaths()[1].toString());
textView.setTextSize(50);
setContentView(textView);

}

public String getSDPath(){  
        File sdDir = null;  
        boolean sdCardExist = Environment.getExternalStorageState()    
                              .equals(android.os.Environment.MEDIA_MOUNTED);  //判断sd卡是否存在  
        if  (sdCardExist)    
        {                                   
            sdDir = Environment.getExternalStorageDirectory();//获取跟目录  
          }    
        return sdDir.toString();  
          
    }  

1、讲述 Environment 类
Environment 是一个提供访问环境变量的类。
Environment 包含常量:

MEDIA_BAD_REMOVAL
解释:返回getExternalStorageState() ,表明SDCard 被卸载前己被移除
MEDIA_CHECKING
解释:返回getExternalStorageState() ,表明对象正在磁盘检查。
MEDIA_MOUNTED
解释:返回getExternalStorageState() ,表明对象是否存在并具有读/写权限
MEDIA_MOUNTED_READ_ONLY
解释:返回getExternalStorageState() ,表明对象权限为只读
MEDIA_NOFS
解释:返回getExternalStorageState() ,表明对象为空白或正在使用不受支持的文件系统。
MEDIA_REMOVED
解释:返回getExternalStorageState() ,如果不存在 SDCard 返回
MEDIA_SHARED
解释:返回getExternalStorageState() ,如果 SDCard 未安装 ,并通过 USB 大容量存储共享 返回
MEDIA_UNMOUNTABLE
解释:返回getExternalStorageState() ,返回 SDCard 不可被安装 如果 SDCard 是存在但不可以被安装
MEDIA_UNMOUNTED
解释:返回getExternalStorageState() ,返回 SDCard 已卸掉如果 SDCard 是存在但是没有被安装

Environment 常用方法:

方法:getDataDirectory()
解释:返回 File ,获取 Android 数据目录。
方法:getDownloadCacheDirectory()
解释:返回 File ,获取 Android 下载/缓存内容目录。
方法:getExternalStorageDirectory()
解释:返回 File ,获取外部存储目录即 SDCard
方法:getExternalStoragePublicDirectory(String type)
解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些类型的文件
方法:getExternalStorageState()
解释:返回 File ,获取外部存储设备的当前状态
方法:getRootDirectory()
解释:返回 File ,获取 Android 的根目录

2、讲述 StatFs 类
StatFs 一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况
StatFs 常用方法:

getAvailableBlocks()
解释:返回 Int ,获取当前可用的存储空间
getBlockCount()
解释:返回 Int ,获取该区域可用的文件系统数
getBlockSize()
解释:返回 Int ,大小,以字节为单位,一个文件系统
getFreeBlocks()
解释:返回 Int ,该块区域剩余的空间
restat(String path)
解释:执行一个由该对象所引用的文件系统
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是获取内存卡循环某个目录下所有图片的路径地址加入到list的示例代码: ```java public List<String> getAllImagePath(String dirPath) { List<String> imagePathList = new ArrayList<>(); File dir = new File(dirPath); if (dir.exists() && dir.isDirectory()) { File[] files = dir.listFiles(); if (files != null && files.length > 0) { for (File file : files) { if (file.isFile() && isImageFile(file)) { imagePathList.add(file.getPath()); } else if (file.isDirectory()) { imagePathList.addAll(getAllImagePath(file.getPath())); } } } } return imagePathList; } private boolean isImageFile(File file) { String fileName = file.getName(); int dotIndex = fileName.lastIndexOf("."); if (dotIndex >= 0) { String fileExt = fileName.substring(dotIndex + 1).toLowerCase(); return fileExt.equals("jpg") || fileExt.equals("jpeg") || fileExt.equals("png") || fileExt.equals("bmp") || fileExt.equals("gif"); } return false; } ``` 调用方法: ```java List<String> imagePathList = getAllImagePath(Environment.getExternalStorageDirectory().getAbsolutePath() + "/your_dir_path"); ``` 其中,`getAllImagePath()` 方法会循环遍历目录下的所有文件,如果是图片文件则加入到 `imagePathList` 列表中;如果是目录则递归调用 `getAllImagePath()` 方法来获取该目录下所有图片文件的路径。`isImageFile()` 方法用于判断文件是否是图片文件。 需要注意的是,为了避免 `java.lang.NullPointerException` 异常,需要确保在读取 SD 之前已经获取了读写 SD 的权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值