版权声明:本文为博主原创文章,未经博主允许不得转载。

在进行视频的下载时,我们经常会面临存储路径的选择,选择一个好的存储路径能对Android系统中的内存起到优化的作用。主流app下载路径分析和常见的路径选择方案做以下总结:

以下提供以一个APP的视频存储路径方案。具体方案的程序流程图如下:

Android系统中数据存储路径概述:

主要分为两大部分:内部存储internal storage和 外部存储external storage

内部存储(internal storage)不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。

存储路径:一般在data/data/包名/ 下的文件

外部存储(external storage),我们很容易认为机身固有存储是内部存储,而扩展的T卡是外部存储。比如我们任务16GB版本的Nexus 4有16G的内部存储,普通消费者可以这样理解,但是安卓的编程中不能,这16GB仍然是外部存储。安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。

存储路径: / sd卡根目录/Android/data// 下的文件,不同机型具体路径有差异

2.对以上 APP流程图的详细分析

(1) 检测sd卡是否存在及安装

/**

* 某路径的sd卡是否存在

* */

public static boolean isSdcardExist(Context context, String path) {

boolean isSdcardExist = false;

List pathList = getExternalSdPath(context);

if(!TextUtils.isEmpty(path) && path.equals(SDCARD_PATH)) {

isSdcardExist = true;

} else if(pathList != null && pathList.size() > 0) {

for(int i = 0; i < pathList.size(); i++) {

if(pathList.get(i).equals(path)) {

isSdcardExist = true;

break;

}

}

}

return isSdcardExist;

}

/**

* sd卡是否安装

*/

public static boolean isSDCardMounted() {

return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);

}

在操作外部存储时,要先判断是否存在sd卡以及安装好(已挂载),并添加如下权限:

(2) 检测安装的sd卡的个数

Android的外部存储是sd卡,一般手机内部有一个内置sd卡,比如一款手机有16G内存,默认将机身内存的16G设置为内置SD卡,也就是手机自带的。有的手机同时还支持外置sd卡插入,这样通过Environment.getExternalStorageDirectory()方法获取到的就是内置存储卡的位置,我们还需要写专门的方法获取外置存储卡的路径。不过当今市场中配备micro SD存储卡插槽的手机越来越少,即便是一直坚持这种设计的三星,今年的S6和S6 Edge也放弃了该功能,使用内置式存储。还有极个别手机有多个sd卡(这里先不考虑)。

/**

* 获取手机中sd卡个数

* */

private static int getSdcardCount(Context context) {

int sdCount = 0;

List pathList = SDCardUtils.getExternalSdPath(context);

if(SDCardUtils.isSDCardMounted()) {

sdCount = 1;

if(pathList != null && pathList.size() > 0) {

sdCount = pathList.size() + 1;

}

} else {

if(pathList != null && pathList.size() > 0) {

sdCount = pathList.size();

}

}

return sdCount;

}

(3) 获取内置sd卡的路径和剩余容量

* sd卡路径

*/

public final static String SDCARD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();

/**

* 获取sd卡剩余空间大小,单位为M

* */

public static double getSdAvailStorage(Context context, String sdPath) {

double availStorage = 0;

if(isSdcardExist(context, sdPath)) {

StatFs sf = new StatFs(sdPath);

long blockSize = sf.getBlockSize();

long availCount = sf.getAvailableBlocks();

availStorage = availCount*blockSize/1024/1024;

}

return availStorage;

}

(3) 获取外置sd卡的路径

/**

* 获取外置SD卡路径

*

*/

public List getExtSDCardPath()

{

List lResult = new ArrayList();

try {

Runtime rt = Runtime.getRuntime();

Process proc = rt.exec("mount");

InputStream is = proc.getInputStream();

InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);

String line;

while ((line = br.readLine()) != null) {

if (line.contains("extSdCard"))

{

String [] arr = line.split(" ");

String path = arr[1];

File file = new File(path);

if (file.isDirectory())

{

lResult.add(path);

}

}

}

isr.close();

} catch (Exception e) {

}

return lResult;

}

(3) 存储到外置sd卡的有关问题

在Android4.4系统以后,将缓存路径切换到外置sd卡的时候,则视频不能下载。原因是 从Android4.4开始,google限制了第三方应用对外置sd卡的读写权限限制,让 android向规范化的方向发展。如果要读写外置sd卡,只能在sd卡根目录下的 Android/data/ 目录来执行读写操作。因此一般不能也不建议存储到外置sd卡。

(4) 新建video文件夹进行视频存储

/**

* android4.4后,SD 卡下载的系统目录

*/

public static String getSysDownLoadFolder(Context context, String path) {

StringBuilder sb = new StringBuilder();

sb.append("Android/data/").append(context.getPackageName()).append(path).toString();

return sb.toString();

}

}

/*

* 在SD卡上创建目录;

*/

public File createDIR(String dirpath) {

File dir=new File(SDPATH+dirpath);

dir.mkdir();

return dir;

}

android存储视频文件夹在哪,Android 中 视频存储路径的一个方案相关推荐

  1. 服务器存储视频文件夹在哪里找,微信视频文件夹存储在什么位置?在哪里能找到...

    平时我们在使用微信时,会接收到好友或者群友发来的微信小视频,这些视频除了可以转发给好友外,还可以保存在手机中,不过很多小伙伴在保存下来视频后,不知道微信视频文件夹的存储位置,那么我们在哪里能找到微信视 ...

  2. android复用字符串文件夹,如何从Android Studio中的值xml字符串文件夹更改字体

    我一直在努力了解如何更改值/ Strings.xml目录的字体系列.有没有简单的方法来改变字体?我已经加了我想要的字体到资产的文件夹,但我的标题是在strings.xml中值目录像这里面:如何从And ...

  3. android 设置铃声文件夹在哪里,Android 设置铃声的文件夹

    Android 设置铃声的文件夹 1 系统自带声音文件存放的位置和内容. 1.1 总目录:/system/media/audio 1.2 闹钟:/system/media/audio/alarms 1 ...

  4. 在VS中给源文件用文件夹分类/在VS中变更源文件路径

    最近把我的项目传到了GitHub,但是因为源文件都是直接在VS中新建的,VS又把所有文件都新建在了同一个目录下,所有文件堆在一起又乱又丑. 但是又不能在资源管理器的文件夹里直接移,这样VS找不到文件又 ...

  5. 安卓Android手机系统内文件夹目录解释

    Bluestorm's Space 博客园 首页 新随笔 联系 订阅 管理 随笔- 423 文章- 3 评论- 58  /storage/sdcard, /sdcard, /mnt/sdcard 三者 ...

  6. android下创建文件夹和修改其权限的方法

    原文:http://www.cnblogs.com/wanqieddy/archive/2011/12/28/2304906.html 由于工作的需要,今天研究了在android下创建文件夹和修改其权 ...

  7. 在Android下创建文件夹

    <!-- @page { margin: 2cm } PRE { font-family: "DejaVu Sans" } P { margin-bottom: 0.21cm ...

  8. android 存放音频文件夹里,Android 实现简单的音乐播放器效果(音频文件的三种存放)...

    Android 实现简单的音乐播放器效果(音频文件的三种存放).三种方法主要使用到的类 MediaPlayer.create() getAssets() new Mediaplayer() - 几个控 ...

  9. Android 读取手机文件夹向指定文件夹下存放

    昨天项目需要向指定的文件夹下保存图片,需要使用文件管理器去选择指定的文件夹,当然最后由于逻辑太奇葩(不能选择文件夹,只能选择文件夹下的某一个文件)被否定了,改为自己读取手机存储的文件夹,并且可以创建. ...

最新文章

  1. 用javascript实现仿163的js广告向下挤压页面的效果
  2. 在HTML5 localStorage中存储对象
  3. inputstream 初始化_MyBatis初始化之加载初始化
  4. Ant build.xml中的各种变量
  5. MongoDB 聚合
  6. python的scikit-learn算法库实现
  7. Visual Studio容器项目工程化心得
  8. cglib动态代理导致注解丢失问题及如何修改注解允许被继承
  9. SpringMVC请求中的普通、POJO、数组集合类型传参与类转换器
  10. Python flask使用实例
  11. Jeesite 客户端验证Jquery Validate及服务器端验证
  12. 验证控件;正则表达式;
  13. AcWing 798. 差分矩阵
  14. 《Crazy sand》感人的沙画艺术
  15. [译]利用贝叶斯推理做硬件故障率的准实时预测
  16. 全球最强免费电子书下载网址
  17. windows系统磁盘空间清理工具SDelete
  18. 毕业设计——基于STM32的智能家具系统(语音识别控制、步进电机、舵机)
  19. “智慧银行”行业研究报告要点整理
  20. 分数排名 mysql_MYSQL分数排名

热门文章

  1. 什么是数据驱动测试?学习创建框架
  2. python系列笔记--耗子(巨细)
  3. 【STL】C++ STL超全总结
  4. 如何使用自己的云服务器做代理服务器
  5. 视频教程-微信公众平台深度开发v2.0第3季——二维码、模板消息-微信开发
  6. python wms系统源码_jeewms仓库管理系统 v2.4.0
  7. 助教日志_【沈阳航空航天大学软件工程 1,2 班】前六周排行榜
  8. CNZZ后台偷偷跑广告
  9. 802.11 Backoff Timer,bugFix_timer_
  10. 2020年中级数据库系统工程师考试笔记7—关系数据库1