阿里云服务器免费领卷啦。

捡代码论坛-最全的游戏源码下载技术网站!

 找回密码
 立 即 注 册

QQ登录

只需一步,快速开始

搜索
关于源码区的附件失效或欺骗帖, 处理办法
查看: 2864|回复: 0

Android存储路径你了解多少?

[复制链接]

4213

主题

210

回帖

12万

积分

管理员

管理员

Rank: 9Rank: 9Rank: 9

积分
127401
QQ
发表于 2017-3-24 18:06:09 | 显示全部楼层 |阅读模式


在了解存储路径之前,先来看看Android QQ的文件管理界面,了解一下QQ的数据文件路径来源,到底是来源于什么地方?




手Q文件管理对应存储目录

我的文件:是指放在QQ指定目录下的文件:
/tencent/QQfile_recv/
(顺便说一下微信的存储目录:/tencent/MicroMsg/Download/)
手机内存:其实是内部存储的根目录,在ES文件浏览器对应的是根目录,路径为:
Environment.getDataDirectory().getParentFile()
SD卡:这里的SD卡是指内置的SD卡,路径为:
Environment.getExternalStorageDirectory()
扩展卡内存:外置SD卡


手机存储
手机分为内部存储和外部存储
1、内部存储


  1. 主要方法        路径
  2. Environment.getDataDirectory()        /data
  3. Environment.getDownloadCacheDirectory()        /cache
  4. Environment.getRootDirectory()        /system
复制代码


这里的内部存储对应的就是手机QQ的手机内存,路径为Environment.getDataDirectory().getParentFile()就是根目录,这个目录下还有一些私密的数据,比如:databases(数据库)、shared_prefs(SharedPreferences)等
注意:没有root的手机不能打开该文件夹的
2、外部存储

外部存储又分为SD卡和扩展卡内存
(1)SD卡
获取路径方式是Environment.getExternalStorageDirectory() /storage/sdcard0

方法        路径
Environment.getExternalStoragePublicDirectory(DIRECTORY_ALARMS)        /storage/sdcard0/Alarms
Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM)        /storage/sdcard0/DCIM
Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS)        /storage/sdcard0/Download
Environment.getExternalStoragePublicDirectory(DIRECTORY_MOVIES)        /storage/sdcard0/Movies
Environment.getExternalStoragePublicDirectory(DIRECTORY_MUSIC)        /storage/sdcard0/Music
Environment.getExternalStoragePublicDirectory(DIRECTORY_NOTIFICATIONS)        /storage/sdcard0/Notifications
Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES)        /storage/sdcard0/Pictures
Environment.getExternalStoragePublicDirectory(DIRECTORY_PODCASTS)        /storage/sdcard0/Podcasts
Environment.getExternalStoragePublicDirectory(DIRECTORY_RINGTONES)        /storage/sdcard0/Ringtones


上面的九个方法对应的就是SD卡的九大公有目录,Google官方建议我们数据应该存储在私有目录下,不建议存储在公有目录下或其他地方
那什么是私有目录呢?
就是在外部存储的App的包名下,如:/storage/emulated/0/Android/data/cwj.test(包名)/files/test
方法        路径
getExternalFilesDir()        /storage/emulated/0/Android/data/cwj.test(包名)/files/test
getExternalCacheDir        /storage/emulated/0/Android/data/cwj.test(包名)/cache/test
一般情况下有包名的路径我们都是调用Context中的方法来获得,没有包名的路径,我们直接调用Environment中的方法获得。
(2)扩展卡内存
扩展内存就是我们插入的外置SD卡,获取扩展内存的路径有点难度,不过Google很牛逼,哈哈,代码如下:

  1. private static String getExtendedMemoryPath(Context mContext) {  
  2.       StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
  3.         Class<?> storageVolumeClazz = null;
  4.         try {
  5.             storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
  6.             Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
  7.             Method getPath = storageVolumeClazz.getMethod("getPath");
  8.             Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
  9.             Object result = getVolumeList.invoke(mStorageManager);
  10.             final int length = Array.getLength(result);
  11.             for (int i = 0; i < length; i++) {
  12.                 Object storageVolumeElement = Array.get(result, i);
  13.                 String path = (String) getPath.invoke(storageVolumeElement);
  14.                 boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
  15.                 if (removable) {
  16.                     return path;
  17.                 }
  18.             }
  19.         } catch (ClassNotFoundException e) {
  20.             e.printStackTrace();
  21.         } catch (InvocationTargetException e) {
  22.             e.printStackTrace();
  23.         } catch (NoSuchMethodException e) {
  24.             e.printStackTrace();
  25.         } catch (IllegalAccessException e) {
  26.             e.printStackTrace();
  27.         }
  28.         return null;
  29. }
复制代码
该方法主要是通过反射的方式使用在sdk中被 隐藏 的类 StroageVolume 中的方法getVolumeList(),获取外部存储的路径。
路径测试:


  1. Log.e("cwj", "外置SD卡路径 = " + getStoragePath(this));
  2. Log.e("cwj", "内置SD卡路径 = " + Environment.getExternalStorageDirectory().getAbsolutePath());
  3. Log.e("cwj", "手机内存根目录路径  = " + Environment.getDataDirectory().getParentFile().getAbsolutePath());
复制代码



  1. 原始链接:http://yoursite.com/2017/03/17/Android存储路径你了解多少/
复制代码



捡代码论坛-最全的游戏源码下载技术网站! - 论坛版权郑重声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与捡代码论坛-最全的游戏源码下载技术网站!享有帖子相关版权
3、捡代码论坛版权,详细了解请点击。
4、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
5、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
6、如无法链接失效或侵犯版权,请给我们来信:jiandaima@foxmail.com

回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立 即 注 册

本版积分规则

技术支持
在线咨询
QQ咨询
3351529868

QQ|手机版|小黑屋|捡代码论坛-专业源码分享下载 ( 陕ICP备15015195号-1|网站地图

GMT+8, 2025-2-22 16:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表