前言:

你对手机存储到底了解多少?从安卓4.4以后在外置内存卡中有没有存储过东西。先上两张图片。

第一张图片是酷我音乐下载设置的选项:

酷我下载截图

第二张是网易云音乐下载设置的选项:

网易云下载截图

从上面两张图可以看到外置卡的名字都是/storage/9016-4EF8那么这个路径是怎么拿到的呢?

任务:明白获取到外置的存储路径。

我们只是讲扩展卡内存,手机的外部存储又分为SD卡和扩展卡内存,目前安卓旗舰手机的SD卡内存为128G,但是好多手机还是可以安装扩展卡,大部分是在卡槽的地方。

想要获取上面的路径,我们可以用反射:

public static String getExtendedMemoryPath(Context mContext) {

StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);

Class> storageVolumeClazz = null;

try {

storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");

Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");

Method getPath = storageVolumeClazz.getMethod("getPath");

Method isRemovable = storageVolumeClazz.getMethod("isRemovable");

Object result = getVolumeList.invoke(mStorageManager);

final int length = Array.getLength(result);

for (int i = 0; i < length; i++) {

Object storageVolumeElement = Array.get(result, i);

String path = (String) getPath.invoke(storageVolumeElement);

boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);

if (removable) {

return path;

}

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

return null;

}

上面的代码就可以找到上面的路径。

新的问题怎样知道外置内存卡的大小呢?可用内存呢?还是上代码

/**

* 根据路径获取内存状态

*

* @param path

* @return

*/

private String getMemoryInfo(File path) {

// 获得一个磁盘状态对象

StatFs stat = new StatFs(path.getPath());

long blockSize = stat.getBlockSize(); // 获得一个扇区的大小

long totalBlocks = stat.getBlockCount(); // 获得扇区的总数

long availableBlocks = stat.getAvailableBlocks(); // 获得可用的扇区数量

// 总空间

String totalMemory = Formatter.formatFileSize(this, totalBlocks * blockSize);

// 可用空间

String availableMemory = Formatter.formatFileSize(this, availableBlocks * blockSize);

return "总空间: " + totalMemory + "可用空间: " + availableMemory;

}

这样就轻松地看到外置存储卡的存储路径以及外置卡的大小。

怎样存储到外部呢?

我们看到上面的图存储路径低有规律的/storage/9016-4EF8/Android/data/包名/都是这个开头的。我们来验证一下能不能存入。打开手机文件夹/Android/data/目录,发现没有我们需要的包名的文件夹。根据大多数人的习惯一定会执行下面的代码:

/**

* 根据文件路径 递归创建文件

*

* @param file

*/

public static void createDipPath(String file) {

String parentFile = file.substring(0, file.lastIndexOf("/"));

File file1 = new File(file);

File parent = new File(parentFile);

if (!file1.exists()) {

parent.mkdirs();

try {

file1.createNewFile();

} catch (IOException e) {

e.printStackTrace();

}

}

}

但是当执行到parent.mkdirs();这行代码时,返回的是false,就是没有成功。我们就手动建一个自己包名的文件夹吧!先验证能不能不能存入:自己建立一个工程包名的文件夹,存入一个简单的action.txt文件发现是可以的。那么问题来了总不能让用户自己去新建一个文件夹吧。问题还是有解决办法的。

context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)

判断一下,我们工程包名的文件夹是否存在,如果不存在就可以执行上面的代码,就会新建工程包名文件夹。

问题:那么安卓4.3及以下的版本呢??

上面的方法好使么?试试就知道!!!现在就要处理挂在的问题了。再4.3~4.0之间的版本大部分都是可以在加入一张位置SD卡的。手机也会有4G或者是8G的自带扩展存储。那么问题来了。这两个怎么区分???

1.外置SD卡是否挂载和路径地址:外置sd卡是否挂载

public static boolean isSDCardMounted() {

return android.os.Environment.getExternalStorageState().equals(

android.os.Environment.MEDIA_MOUNTED);

}

外置SD卡的路径:

//外置sd卡路径

String sdcardPath = System.getenv("EXTERNAL_STORAGE");

//外置sd卡路径

String sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();

先判断是否挂载SD卡。如果SD卡存在才能使用外置SD卡。

2.手机自带的扩展存储:路径:

//手机自带的扩展存储路径

String extSdcardPath = System.getenv("SECONDARY_STORAGE");

这样就基本可以兼容4.0以上的安卓版本了。

注意:只是测试了部分手机。

android storage 路径,风儿带你了解Android存储路径。相关推荐

  1. mysql修改路径报错_mysql修改数据存储路径报错处理

    Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' 解决?: >>> vim ...

  2. mysql换数据存储路径,mysql查看和修改数据存储路径并转移数据

    最近本地c盘容量飘红了,需要腾出空间来,所以找到了mysql本地库数据比较大,所以想着把①mysql的储存路径改一下:②把历史数据移动过去: 1.使用用户名登录mysql Wi键 +r 打开cmd 登 ...

  3. 修改notebook的默认路径_更改jupyter notebook默认存储路径

    jupyter notebook默认存储路径在C盘下,有时候会丢失文件,很不方便.最好更改一下其默认存储路径比较安全. 1.在想要设置的存储路径下新建一个文件夹,如我在D盘下新建了jupyter-no ...

  4. jupyter 导入文件路径_更改jupyter notebook默认存储路径

    jupyter notebook默认存储路径在C盘下,有时候会丢失文件,很不方便.最好更改一下其默认存储路径比较安全. 1.在想要设置的存储路径下新建一个文件夹,如我在D盘下新建了jupyter-no ...

  5. Android逆向之旅---带你解读Android中新型安全防护策略

    一.前言 最近有一个同学,发给我一个设备流量访问检测工具,但是奇怪的是,他从GP上下载下来之后安装就没有数据了,而在GP上直接安装就可以.二次打包也会有问题.所以这里就可以判断这个app应该是有签名校 ...

  6. android获得系统自带颜色,这些Android系统样式中的颜色属性你知道吗?

    Android 系统样式中的颜色属性 几个常用的颜色属性 先放上一张经典的图片,图片来自网络. 这张图在网上很是流传,也不知道当初是哪位大神标注的,很好的说明了 Android 系统中的几个常用的颜色 ...

  7. Android APP存储路径和缓存清理规范

    1. Android APP统一存储数据规范 基于Android系统对存储卡访问的各种特性,在充分保证基线的产品交互体验前提下,定义Android APP各业务开发中的可选存储路径,对应存储特性,各自 ...

  8. Carson带你学Android:手把手带你入门跨平台UI开发框架Flutter

    前言 Flutter 作为Google出品的一个新兴的跨平台移动客户端UI开发框架,正在被越来越多的开发者和组织使用,包括阿里的咸鱼.腾讯的微信等. 今天,我将献上一份 <全面 & 详细 ...

  9. Carson带你学Android:全面解析列表ListView与AdapterView

    前言 ListView在Android开发中十分常见 今天,我将为大家带来ListView与AdapterView全面解析,含其特点.工作原理等,希望你们会喜欢. Carson带你学Android系列 ...

最新文章

  1. 又一个智商税产品“路由器防辐射笼”,信号都没了,还能火爆全网...
  2. docker 开发常用命令总结
  3. SAP CRM HANA report filter的工作原理
  4. Shell整数型变量自增自减的实现方式(+1,-1,++,--)
  5. java使用kaptcha生成图片验证码
  6. \t\t使用Google APP Engine 完成个人代理服务器架设
  7. 网络规划设计师考点总结
  8. 华为USG6000V防火墙简单配置案例
  9. AE MG动画脚本motion2 脚本使用方法学习笔记
  10. 计算机培训日志范文30篇,班主任工作日志20篇.docx
  11. if else 的使用
  12. 如何进行app消息推送(push)
  13. 用DirectX12绘制一个几何体的程序详述
  14. 宿命论与非宿命论新解
  15. 登录后刷新token
  16. 学习管理系统五大好处
  17. 从编译器源码中提取ARMv8的指令编码
  18. Linux系统中UID和GID详解
  19. maya通过python输出fbx_Python:Maya2WRL简单导出脚本(source included)
  20. android启动速度测试,如何测试Android应用的启动速度?

热门文章

  1. 不知不觉openGL已经到4.5了
  2. C#——获取银行卡所属银行,验证银行卡号是否正确
  3. 愚人节,看你们把AI逼成什么样了?
  4. 支付宝/云闪付个人免签
  5. sqli-labs11-22关闯关心得与思路
  6. 前后台系统和RTOS系统的区别
  7. easyflow 流程图 节点自动布局
  8. how to build sailfish-office(cmake mb2/sb2)
  9. Unity3D使用经验总结 优点篇
  10. 腾讯云搭建多终端《你画我猜》Socket服务器