From:http://blog.csdn.net/u011290399/article/details/10363881

在项目中,发现通过Android提供的API获取外置SDCard的操作一直不能成功,一直没有太多的时间解决该问题

昨天週末,终于可以抽空研究了一下这个问题了

在网上搜索下,结果百度的搜索引擎怎麽搜索也未能给我满足需求的搜索结果

不过,搜索出的内置SDCard与外置SDCard互换操作给出了思路

先看看SDCard的路径:/storage/extSdCard、/storage/sdcard0、/storage/sdcard0/external-sdcard、/storage/external-sdcard等等路径

网络上给出的很多比较挫的方法:

1、通过Android的API获取其父路径的File对象,然后获得File对象内的文件路径字符串数组,遍历、寻找出外置SDCard路径,看上面给出的SDCard路径就发现不能完全实现

2、通过StorageManager类反射获得getVolumePaths的结果集,测试一部手机通过,不过没太多的保障

3、写死路径…… 尼玛,这个能是一个程序员说出的话,小爷当时看到都诅咒说出这句话的家伙

4、根据网上搜索出来外置、内置SDCard互换操作,想到是否可以读取vold.fstab文件,直接获得外置SDCard路径,结果发现好多手机上找不到vold.fstab文件……

虽然找不到vold.fstab文件,但是该文件内的信息还是存放在手机的内存中的,所以,方法就来了。

  1. // private static String cmd = "mount";
  2. private static String cmd = "cat /proc/mounts";
  3. private static String format = "sdcard";
  4. private static String sdCard = Environment.getExternalStorageDirectory().getAbsolutePath();
  1. /**
  2. * 獲取外置SDCard的絕對路徑
  3. * @return
  4. */
  5. public static String getExternalPath() {
  6. BufferedReader read = null;
  7. String external_SDCard = sdCard;
  8. Runtime runtime = Runtime.getRuntime();
  9. try {
  10. Process process = runtime.exec(cmd);
  11. read = new BufferedReader(new InputStreamReader(process.getInputStream()));
  12. String line;
  13. while ((line = read.readLine()) != null) {
  14. // if (line.toLowerCase().contains(format) && line.contains(".android-secure")) {
  15. if (line.toLowerCase().contains(format)) {
  16. String[] array = line.split(" ");
  17. if (array != null && array.length >= 5) {
  18. String temp = array[1].replace("/.android_secure", "");
  19. if (!sdCard.equals(temp)) {
  20. external_SDCard = temp;
  21. }
  22. }
  23. }
  24. }
  25. } catch (Exception e) {
  26. external_SDCard = sdCard;
  27. e.printStackTrace();
  28. } finally {
  29. IOUtils.freeResource(read, null);
  30. }
  31. return external_SDCard;
  32. }

Android之內置、外置SDCard的更多相关文章

  1. Android获取内置sdcard跟外置sdcard路径

    Android获取内置sdcard跟外置sdcard路径.(测试过两个手机,亲测可用) 1.先得到外置sdcard路径,这个接口是系统提供的标准接口. 2.得到上一级文件夹目录 3.得到该目录的所有文 ...

  2. Android-获取外置SDcard路径

    Android手机支持SDcard.目前很多手机厂商把SDcard集成到手机中,当然有的手机同时也支持可插拔的SDcard.这就有了内置SDcard和位置SDcard之分.当手机同时支持内置和外置SD ...

  3. 关于华为x2中的外置SDCard的使用

    一.前要 记录一下最近在开发生产过程中遇到的一个小问题.在使用x2的华为7寸平板时,由于需要大内存去录制视频,所以就使用X2自带的SDCard口,插入1个128G的SDCard卡.但是Android ...

  4. 第四章:Python基础の快速认识內置函数和操作实战

    本課主題 內置函数介紹和操作实战 装饰器介紹和操作实战 本周作业 內置函数介紹和操作实战 返回Boolean值的內置函数 all( ): 接受一個可以被迭代的對象,如果函数裡所有為真,才會真:有一個是 ...

  5. android获取内置和外置SD卡路径 - z

    本文将介绍Android真机环境下如何获取内置和外置SD卡路径. 测试环境:三星Note3,其他手机待测试... 所需权限(AndroidManifest.xml文件里) <uses-permi ...

  6. Android切换前后置摄像头并录制视频

    项目需要对微信的视频模块也看了一下,在此就对这块进行了一个开发.首先给出效果图 首先给出java代码 /** * RecordActivity.java * 版权所有(C) 2013 * 创建:cui ...

  7. Android使用Linux mount获取SdCard存储文件夹

    Android的智能手机各不同样.如今非常多Android智能手机都是自带存储,有的还带有扩展内存的Sdcard卡槽. 在Android开发中,非常多时候依据Android提供的获取SdCard存储方 ...

  8. android 怎样内置/预置/预编译文件(运行程序,应用程序,apk, jar, lib 等随意文件)到系统中

    方法一:  如果要内置的软件名称为iperf.exe 1. 将iperf.exe放到Codebase的随意一个文件夹下(该文件夹必须可以在搜索Android.mk时被搜索到),比方system/ipe ...

  9. android中创建模拟器的 SDCard

    在eclipse中安装了android环境后,可以直接创建AVD和sdcard的,windows->Android Virtual Device Manager,创建一个AVD时,可以同时创建s ...

随机推荐

  1. WIN10 无法访问2003 server共享

    With Windows 10 v1803 or Spring Creators update released I have decided to do a fresh installation o ...

  2. mybatis 映射器

    1 映射器 Mapper 是由java接口和 XML 文件共同组成.它的作用如下 1)定义参数类型 2)描述缓存 3)描述 SQL 语句 4)定义查询结果和POJO的映射关系 2 SqlSession ...

  3. unity, water cube

    <纪念碑谷>里有一关开始是一个宝箱展开后里面有一个water cube,其中还有小鱼在游.如下截图: 因为我们知道<纪念碑谷>是unity做的,而现在正开始学unity,所以也 ...

  4. MySQL存储过程使用实例详解

    本文介绍关于在MySQL存储过程游标使用实例,包括简单游标使用与游标循环跳出等方法 例1.一个简单存储过程游标实例 DROP PROCEDURE IF EXISTS getUserInfo $$CRE ...

  5. Unity3D 应用程序退出调用OnDestroy测试

    测试结果为关闭游戏,会调用OnDestroy().但OnApplicationQuit()比它提前调. using UnityEngine; using System.Collections; pub ...

  6. atitit.新增编辑功能 跟orm的实现 attilax p31

    atitit.新增编辑功能 跟orm的实现 attilax p31 1. 流程的实现 1 2. view的实现(dwr) 1 3. 获取表结构 1 4. grep filt req params 2 ...

  7. [svc]visio绘制模具

    visio2016狮子XL自定义运维模具下载: https://github.com/lannyMa/scripts/blob/master/%E7%BE%8E%E5%8C%96%E5%AE%9A%E ...

  8. IOS委托,实现两个UIView相互传值

    转自:http://my.oschina.net/wbei/blog/89325 detegate委托在IOS中是一种随处可见的模式,通俗的说,就是我把想做的某件事委托给其他人去做,就好像Java中的 ...

  9. Android Camera API/Camera2 API 相机预览及滤镜、贴纸等处理

    Android Lollipop 添加了Camera2 API,并将原来的Camera API标记为废弃了.相对原来的Camera API来说.Camera2是又一次定义的相机 API,也重构了相机 ...

  10. struts2异常处理机制

    一.处理一般异常(javaBean异常) struts2进行异常处理首先需要添加exception拦截器,而默认拦截器栈已经加入了这个拦截器,所以不用特意的声明.在Struts 2框架中,采用声明式异 ...