- 浏览: 1321059 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (132)
- android Launcher (15)
- 收藏夹 (3)
- UI设计 (28)
- J2EE (2)
- android网络编程 (8)
- 项目经理是熬出来的 (8)
- Android图像处理 (5)
- 系统层开发 (12)
- 数据库 (2)
- 程序员是熬出来的 (2)
- Android技巧 (11)
- 地图相关 (2)
- Android底层 (9)
- Android疑难杂症 (4)
- 开发工具 (4)
- 知识梳理 (8)
- 源码阅读 (7)
- Media媒体库 (5)
- 调试技术 (3)
- Android蓝牙 (3)
- 动画特效 (5)
- jni (3)
- 串口通信 (1)
- Android优化 (3)
- 架构设计 (1)
- Android Test (1)
- 翻译系列 (0)
最新评论
-
我说123木头人雪雪:
...
Android截屏并对图片做高斯模糊处理 -
ysc123shift:
没有源码。
Android截屏并对图片做高斯模糊处理 -
我de专属doll:
你那个Jni库是自己编译的还是有现成的呢?
Android media媒体库分析之:分类别统计媒体文件大小 -
zhunanfengfeimeng:
想做项目经理?这些工具必须了解 -
ls0609:
一个带人脸识别的智能照相机demohttp://blog.cs ...
Android 调用相机,获取的图片太小
对系统媒体库不了解的线看这儿:
Android media媒体库分析之:MediaProvider http://gqdy365.iteye.com/blog/2150883
Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描
http://gqdy365.iteye.com/blog/2164836
先看一下要实现的效果:
上图是系统设置中分类别对文件所占空间的统计,项目中要统计媒体文件所占空间,于是研究了一下系统的做法,收获如下:
1、从源码packages/app/下找到settings工程,找到存储功能的实现,相关类有:
StorageMeasurement类中启动服务,绑定服务,通知界面更新;
StorageVolumePreferenceCategory显示界面
StorageMeasurement中建立了与DefaultContainerService服务的通信,指定要扫描的目录:
上面这个set就是定义了我们系统里面常用的目录:
获取每个目录的大小:
其中getDirectorySize方法通过IMediaContainerService调用了DefaultContainerService服务中的方法,在DefaultContainerService中获取到所有信息之后回调IMediaContainerService,再更新界面;
也就是说:系统只统计了上述几个目录的大小(sMeasureMediaTypes中定义的),如果你的歌曲是拷贝到其他目录,那系统存储里面是不会统计使用量。看来Android也不是很智能嘛!!!难度是考虑效率???
2、如何获取某个目录的大小?
先看一下系统是怎么做的:
下面方法是在DefaultContainerService中定义的,获取某一目录大小,获取某一文件大小;
但是
MeasurementUtils.measureDirectory(path)和Libcore.os.statfs(path)
两个方法我们都调不到,怎么办?
我们把MeasurementUtils类从源码中拷贝出来到我们的功能,但注意要保留包路径,否则可以编译通过,但无法运行,因为他里面用到了一个本地方法,需要加载一个so文件。如下:
这样就可以解决第一个问题了;
再来看第二方法,其实这个方法我们用不到,我们已经通过第一个方法获取到指定文件夹的大小了,那关于某一个文件的大小我们之间通过file可以拿到。
第二个方法有一个封装类:starfs,可以获取rom、sdcard的总大小和可用空间,如下:
这个可以直接在我们获取总体容量时使用。
上面把系统是怎么做的大概搞清楚,下面我们来实现我们的需求:
一、思路:
1、Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描
http://gqdy365.iteye.com/blog/2164836这篇文章可以知道,媒体文件(音频、视频、图片)系统完成扫描之后就存入了数据库,那我们可以查询数据库,得到所有媒体文件,把这些文件的大小相加。
2、由于sdcard可以会unmount,所以在相加时要根据路径判断此文件是否存在;
3、下面时我实现的工具类,希望对你有用:
Android media媒体库分析之:MediaProvider http://gqdy365.iteye.com/blog/2150883
Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描
http://gqdy365.iteye.com/blog/2164836
先看一下要实现的效果:
上图是系统设置中分类别对文件所占空间的统计,项目中要统计媒体文件所占空间,于是研究了一下系统的做法,收获如下:
1、从源码packages/app/下找到settings工程,找到存储功能的实现,相关类有:
com.android.settings.deviceinfo.StorageMeasurement com.android.settings.deviceinfo.StorageVolumePreferenceCategory 其他相关源码: com.android.defcontainer.DefaultContainerService
StorageMeasurement类中启动服务,绑定服务,通知界面更新;
StorageVolumePreferenceCategory显示界面
StorageMeasurement中建立了与DefaultContainerService服务的通信,指定要扫描的目录:
/** Media types to measure on external storage. */ private static final Set<String> sMeasureMediaTypes = Sets.newHashSet( Environment.DIRECTORY_DCIM, Environment.DIRECTORY_MOVIES, Environment.DIRECTORY_PICTURES, Environment.DIRECTORY_MUSIC, Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS, Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_PODCASTS, Environment.DIRECTORY_DOWNLOADS, Environment.DIRECTORY_ANDROID);
上面这个set就是定义了我们系统里面常用的目录:
public static String DIRECTORY_DOWNLOADS = "Download"; public static String DIRECTORY_DCIM = "DCIM"; public static String DIRECTORY_MUSIC = "Music"; public static String DIRECTORY_PICTURES = "Pictures"; public static String DIRECTORY_MOVIES = "Movies"; ...
获取每个目录的大小:
for (String type : sMeasureMediaTypes) { final File path = currentEnv.getExternalStoragePublicDirectory(type); final long size = getDirectorySize(imcs, path); details.mediaSize.put(type, size); }
其中getDirectorySize方法通过IMediaContainerService调用了DefaultContainerService服务中的方法,在DefaultContainerService中获取到所有信息之后回调IMediaContainerService,再更新界面;
也就是说:系统只统计了上述几个目录的大小(sMeasureMediaTypes中定义的),如果你的歌曲是拷贝到其他目录,那系统存储里面是不会统计使用量。看来Android也不是很智能嘛!!!难度是考虑效率???
2、如何获取某个目录的大小?
先看一下系统是怎么做的:
下面方法是在DefaultContainerService中定义的,获取某一目录大小,获取某一文件大小;
@Override public long calculateDirectorySize(String path) throws RemoteException { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); final File directory = new File(path); if (directory.exists() && directory.isDirectory()) { return MeasurementUtils.measureDirectory(path); } else { return 0L; } } @Override public long[] getFileSystemStats(String path) { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); try { final StructStatFs stat = Libcore.os.statfs(path); final long totalSize = stat.f_blocks * stat.f_bsize; final long availSize = stat.f_bavail * stat.f_bsize; return new long[] { totalSize, availSize }; } catch (ErrnoException e) { throw new IllegalStateException(e); } }
但是
MeasurementUtils.measureDirectory(path)和Libcore.os.statfs(path)
两个方法我们都调不到,怎么办?
我们把MeasurementUtils类从源码中拷贝出来到我们的功能,但注意要保留包路径,否则可以编译通过,但无法运行,因为他里面用到了一个本地方法,需要加载一个so文件。如下:
这样就可以解决第一个问题了;
再来看第二方法,其实这个方法我们用不到,我们已经通过第一个方法获取到指定文件夹的大小了,那关于某一个文件的大小我们之间通过file可以拿到。
第二个方法有一个封装类:starfs,可以获取rom、sdcard的总大小和可用空间,如下:
/** * The size, in bytes, of a block on the file system. This corresponds to * the Unix {@code statfs.f_bsize} field. */ public int getBlockSize() { return (int) mStat.f_bsize; } /** * The total number of blocks on the file system. This corresponds to the * Unix {@code statfs.f_blocks} field. */ public int getBlockCount() { return (int) mStat.f_blocks; }
这个可以直接在我们获取总体容量时使用。
上面把系统是怎么做的大概搞清楚,下面我们来实现我们的需求:
一、思路:
1、Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描
http://gqdy365.iteye.com/blog/2164836这篇文章可以知道,媒体文件(音频、视频、图片)系统完成扫描之后就存入了数据库,那我们可以查询数据库,得到所有媒体文件,把这些文件的大小相加。
2、由于sdcard可以会unmount,所以在相加时要根据路径判断此文件是否存在;
3、下面时我实现的工具类,希望对你有用:
package com.test.jerome; import java.io.File; import java.util.ArrayList; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Environment; import android.os.StatFs; import android.provider.MediaStore; public class MemoryUtil { Context mContext; public MemoryUtil(Context context) { mContext = context; } /** * 获得SD卡总大小 * * @return */ public long getSDTotalSize() { File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long totalBlocks = stat.getBlockCount(); return blockSize * totalBlocks; } /** * 获得sd卡剩余容量,即可用大小 * * @return */ public long getSDAvailableSize() { File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return blockSize * availableBlocks; } /** * 获得机身内存总大小 * * @return */ public long getRomTotalSize() { File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long totalBlocks = stat.getBlockCount(); return blockSize * totalBlocks; } /** * 获得机身可用内存 * * @return */ public long getRomAvailableSize() { File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return blockSize * availableBlocks; } /** * 外部存储中所有音频文件所占内存 * * @return */ public long getAudioTotalSize() { ArrayList<MemoryInfo> resultList = queryAllMediaList(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); long size = 0L; for (MemoryInfo cInfo : resultList) { File file = new File(cInfo.getFilePath()); if(null!=file &&file.exists()){ size += cInfo.getFileSize(); } } return size; } /** * 外部存储中除音频、视频、图片之前其他文件所占内存 * * @return */ public long getOtherTotalSize() { long size = getSDTotalSize() - getSDAvailableSize() - getPictureTotalSize() - getVideoTotalSize() - getAudioTotalSize(); if (size < 0L) { size = 0L; } return size; } /** * 外部存储中所有图片文件所占内存 * * @return */ public long getPictureTotalSize() { ArrayList<MemoryInfo> resultList = queryAllMediaList(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); long size = 0L; for (MemoryInfo cInfo : resultList) { File file = new File(cInfo.getFilePath()); if(null!=file &&file.exists()){ size += cInfo.getFileSize(); } } return size; } /** * 外部存储中所有视频文件所占内存 * * @return */ public long getVideoTotalSize() { ArrayList<MemoryInfo> resultList = queryAllMediaList(MediaStore.Video.Media.EXTERNAL_CONTENT_URI); long size = 0L; for (MemoryInfo cInfo : resultList) { File file = new File(cInfo.getFilePath()); if(null!=file &&file.exists()){ size += cInfo.getFileSize(); } } return size; } public ArrayList<MemoryInfo> queryAllMediaList(Uri uri) { //我们只需要两个字段:大小、文件路径 Cursor cursor = mContext.getContentResolver().query( uri,new String[] { MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA }, null, null, null); ArrayList<MemoryInfo> musicList = new ArrayList<MemoryInfo>(); try{ if (cursor.moveToFirst()) { do { MemoryInfo mInfo = new MemoryInfo(); mInfo.setFileSize(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE))); mInfo.setFilePath(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))); }while(cursor.moveToNext()); } }finally{ if(cursor != null){ cursor.close(); } } return musicList; } class MemoryInfo { private long fileSize = 0L; private String filePath = ""; public long getFileSize() { return fileSize; } public void setFileSize(long fileSize) { this.fileSize = fileSize; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } } }
发表评论
-
SoundPool使用总结
2015-10-09 11:32 13037一、与MediaPlayer的对比: SoundPool适合短 ... -
(转)为什么第三方应用能早于System的app启动
2015-06-18 10:52 2183Android应用的启动顺序网上有一大堆资料可以查阅了,这里就 ... -
Android led灯实现大致流程
2015-05-11 18:07 17464led灯的控制在http://gqdy365.iteye.co ... -
Android应用程序获取系统权限
2015-04-29 18:27 1059引用 如何使Android应用程序获取系统权限 ... -
Android jni系统变量、函数、接口定义汇总
2015-03-09 11:29 8406在做Android jni开发时,jni为我们提供了哪些函数、 ... -
Android串口通信:串口读写实例
2015-03-05 09:40 108765在Android串口通信:基本知识梳理(http://gqdy ... -
Android自动挂断来电(ITelephony的使用)
2015-01-08 09:16 14537项目中需要在接收到来电之后把电话挂断,再做一些事情,在研究了A ... -
Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描
2014-12-10 15:35 3749之前文章中分析了Android media媒体库,详见:htt ... -
Android media媒体库分析之:MediaProvider
2014-11-01 10:01 17178亲们,原创文章转载时 ... -
Android关于短信加密
2014-08-28 16:07 2493关于Android短信加密功能,我初步了解的如下(只在Andr ... -
Android jni
2014-08-23 15:22 0http://code.google.com/p/androi ... -
Android常用shell指令收集
2016-02-15 17:24 1204一、base cmd 1、挂载文件系统:mount -o r ... -
android系统信息(内存、cpu、sd卡、电量、版本)获取
2011-05-31 11:42 38156要转载请注明出处:http://gqdy365.iteye.c ...
相关推荐
媒体查询 CSS媒体查询允许开发者基于浏览网站的设备的特性来应用不同的样式申明,最常用的特性是视口宽度。 GCF 谷歌内嵌浏览器框架, 使用此插件,用户可以通过Internet Explorer的用户界面,以Chrome内核的渲染方式...
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
基于java的学生网上请假系统的开题报告.docx
社会经济繁荣发展的今天,电子商务得到了飞速发展,网上交易越来越彰显出其独特的优越性,在人们的日常生活中,出现了各种类型的交易网站。其中一个就是车辆易主交易网站,它是一个服务于用户买卖二手车辆的交易网站,为用户提供了平等互利、方便快捷的网上交易平台,通过这一类型的网站,用户可自由出售和购买车辆。 本课题主要根据车辆本身的特性,充分发挥互联网的特点与优势,构建一个以二手车辆为商品、基于互联网平台的车辆易主业务交易管理系统,并根据车辆易主业务交易管理系统的应用需求,进行需求分析,进而对网站系统作规划设计。采用IDEA为运行平台,以SSH为框架,运用HTML语言、JSP技术、MySql数据库、JSP与后台数据库链接等关键技术建设二手车网上交易系统,构建车辆易主交易系统的会员注册与登录,网站首页展示、用户发布商品车辆,用户求购商品车辆,分页浏览、购物系统、用户后台管理、管理员用户后台管理等功能,并使这些功能得以实现并更好为用户服务。网站整体构建完成且测试成功后,用户可以进入网站进行注册、登录,登录后,用户可以在网站上发布自己的闲置车辆或者寻找想要购买的车辆,还可以收藏车辆,管理发布和收藏的车辆,
SQLite3的向量扩展库,windows dll,版本0.1.5