文档章节

Android获取手机自带SDCard和外置SDCard路径

yuewawa
 yuewawa
发布于 2016/02/27 11:36
字数 458
阅读 45
收藏 0

获取内置SD卡很简单,就一行代码

    /**
     * 获取内置SD卡路径
     * @return
     */
    public String getInnerSDCardPath() {  
        return Environment.getExternalStorageDirectory().getPath();  
    }

获取外置SD卡比较麻烦,

/**
     * 获取外置SD卡路径
     * @return
     */
public List<String> getExtSDCardPaths() {
    	         List<String> paths = new ArrayList<String>();
    	         String extFileStatus = Environment.getExternalStorageState();
    	         File extFile = Environment.getExternalStorageDirectory();
    	         if (extFileStatus.endsWith(Environment.MEDIA_UNMOUNTED)
    	                 && extFile.exists() && extFile.isDirectory()
    	                 && extFile.canWrite()) {
    	             paths.add(extFile.getAbsolutePath());
    	         }
    	         try {
    	             // obtain executed result of command line code of 'mount', to judge
    	             // whether tfCard exists by the result
    	             Runtime runtime = Runtime.getRuntime();
    	             Process process = runtime.exec("mount");
    	             InputStream is = process.getInputStream();
    	            InputStreamReader isr = new InputStreamReader(is);
    	             BufferedReader br = new BufferedReader(isr);
    	             String line = null;
    	             int mountPathIndex = 1;
    	             while ((line = br.readLine()) != null) {
    	                 if ((!line.contains("fat") && !line.contains("fuse") && !line
    	                         .contains("storage"))
    	                         || line.contains("secure")
    	                         || line.contains("asec")
    	                         || line.contains("firmware")
    	                         || line.contains("shell")
    	                         || line.contains("obb")
    	                         || line.contains("legacy") || line.contains("data")) {
    	                     continue;
    	                 }
    	                 String[] parts = line.split(" ");
    	                 int length = parts.length;
    	                if (mountPathIndex >= length) {
    	                     continue;
    	                 }
    	                 String mountPath = parts[mountPathIndex];
    	                 if (!mountPath.contains("/") || mountPath.contains("data")
    	                         || mountPath.contains("Data")) {
    	                     continue;
    	                 }
    	                 File mountRoot = new File(mountPath);
    	                 if (!mountRoot.exists() || !mountRoot.isDirectory()
    	                         || !mountRoot.canWrite()) {
    	                    continue;
    	                 }
    	                 boolean equalsToPrimarySD = mountPath.equals(extFile
    	                         .getAbsolutePath());
    	                 if (equalsToPrimarySD) {
    	                     continue;
    	                 }
    	                 paths.add(mountPath);
    	             }
    	         } catch (IOException e) {
    	             // TODO Auto-generated catch block
    	             e.printStackTrace();
    	         }
    	         return paths;
    	     }

首先获取了Android标准一部分的外置SD卡,如果它可用的话。

然后利用运行时,通过命令行函数"mount"来获取所有的存储位置,并对返回的结果进行SD卡或者TF卡的查找。

最后返回了所有可用于存储的不同的卡的位置,用一个List来保存。由于不是所有的手机都支持TF卡,因而这个List包含的路径未必很多,只有一个SD卡的手机只会返回一个路径,多个可用存储位置的会返回多个路径。

但有一点,是必须的,paths.get(0)肯定是外置SD卡的位置,因为它是primary external storage.

© 著作权归作者所有

共有 人打赏支持
yuewawa
粉丝 4
博文 98
码字总数 16217
作品 0
南京
如何区分手机内置存储卡与外置存储卡

android系统自从升级到2.3以后,多一个功能,可以判断存储卡是否是可以卸载的。Environment.isExternalStorageRemovable(),通过此方法我们可以知道手机上的存储卡是手机自带的还是外边可插拔...

wanyang
2014/01/07
0
0
Android手机自带内部存储路径的获取

我有一台中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名为Micro SD Card),但是机身自带了一个内置存储...

Cundong
2014/07/08
0
3
Android 外部存储权限分析

不知道你有么有发现,来自菜鸟的成长史:http://blog.csdn.net/zjbpku/article/details/25161131, KitKat之后的版本不再支持用户对外置SDcard(Secondary Storage)的写入等操作。如果用户想要...

sflfqx
2015/02/09
0
0
Android app的文件缓存目录

Android app的文件缓存目录可以是app内置私有的目录,当然也可以选择外置sdcard目录 内置私有目录 /data/data/[packagename]/files 文件缓存目录,一般存小的文件缓存,如果是图片,不建议放这...

michaelpan
2014/12/19
0
0
android应用把文件存放在SDCard

1、在程序中访问SDCard,你需要申请访问SDCard的权限 在AndroidManifest.xml中加入访问SDCard的权限如下: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schem......

罗荣熙
2012/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day92-20180918-英语流利阅读-待学习

健身最大的敌人不是懒惰,而是逞强 Daniel 2018-09-19 1.今日导读 还记得 2008 年北京奥运会运动员刘翔的退赛风波吗?那天几乎所有中国人都将视线聚焦在了鸟巢体育馆 110 米栏的项目上,迫不...

飞鱼说编程
25分钟前
2
0
70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
3
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
6
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
56
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部