- 浏览: 1314169 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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媒体应用程序时(Audio、Image、Video)需要对Android的媒体提供者(MediaProvider)做详细的分析,下面记录一下我的收获:
一、获取MediaProvider:
该工程在系统源码的packages\providers目录下,提出并导入Eclipse,便于阅读;
图中可见都很多报错的,是滴,因为需要一些系统标准sdk之外的接口,不过不影响我们阅读代码。
二、工程结构及内部关系:
可以从上图看出包含4个文件:
MediaScannerService.Java:媒体服务,配合广播实现媒体扫描类的实例化,数据库的初始化等工作,也向外提供接口;
MediaScannerReceiver.Java:一个广播接收器,用于接受系统发给媒体服务的广播并启动媒体服务;
MediaProvider.Java:媒体数据库的封装类,代码量比较大(四千多行),功能比较复杂,但总的来说就是创建数据库,对外提供URI以实现对数据库的增删改查功能;
MediaThumbRequest.Java:媒体文件缩略图请求类,与MediaProvider配合使用;
上一个关系图更直观一些:
上图不是标准的类图,只是为了梳理逻辑关系画的结构图。
MediaProvider所处的位置及作用见图中红色框中的内容;
上图还包括其他内容:
1、App层:audio、image、video如何与媒体库进行交互;
2、框架层(android.media包下):如何实现媒体的扫描;
3、Native层:如何实现正在的媒体文件解析;
4、资源存储层:sd卡、U盘等介质,DTCM存储缩略图;
三、类详解
1、MediaScannerReceiver:
三类情况需要启动扫描服务:
a、系统启动完成;
b、媒体挂载(EXTERNAL_VOLUME_SD、EXTERNAL_VOLUME_UDISK、EXTERNAL_VOLUME_EXTSD);
c、媒体文件扫描广播(ACTION_MEDIA_SCANNER_SCAN_FILE);
scanFile和scan方法很简单,只是启动媒体服务即可:
2、MediaScannerService:
第一步:启动一个线程
在线程中拿到当前的消息队列,使用handler处理消息;
第二部:启动ServiceHandler处理消息
ServiceHandler中还是处理两种,一种是扫描,第二种是具体媒体文件的解析;
看一下第二种是如何实现的:
那么问题来了:如果我们在App中想让系统媒体库解析具体某一个文件,应该怎么做呢?
从上面代码可以看到,MediaScannerService给我们提供的绑定接口,我们只需要传递filepath和一个IMediaScannerListener listener即可,媒体库在解析完之后会回调scanCompleted方法告诉我们解析结果;
第三步:创建MediaScanner对象,完成扫描和解析;
可见具体扫描、解析工作也不是MediaScannerService做的,MediaScannerService是只在调用sacn、acanfile方法时创建了MediaScanner对象并交给他处理;
MediaScanner在android.media.MediaScanner系统framework里面,这儿就不做讨论了;
MediaScannerService基本就这些内容了;
3、MediaProvider:
MediaProvider就是创建数据库,对外提供URI以实现对数据库的增删改查功能;
4、MediaThumbRequest:
Audio、Image、Video文件都是有缩略图的,缩略图路径存储在DB中,其真实文件存储在sd卡的DICM文件夹下,MediaThumbRequest只是提供给MediaProvider类操作数据库使用。
主要的就两个方法,一个新建缩略图方法:execute,一个更新缩略图方法:updateDatabase
新技能get:应用中获取缩略图,期待下一篇文章;
至此,MediaProvider结构分析清楚了,后续计划补两片文章:
APP中使用系统媒体库;
媒体文件扫描、解析是如何实现的;
在做Android媒体应用程序时(Audio、Image、Video)需要对Android的媒体提供者(MediaProvider)做详细的分析,下面记录一下我的收获:
一、获取MediaProvider:
该工程在系统源码的packages\providers目录下,提出并导入Eclipse,便于阅读;
图中可见都很多报错的,是滴,因为需要一些系统标准sdk之外的接口,不过不影响我们阅读代码。
二、工程结构及内部关系:
可以从上图看出包含4个文件:
MediaScannerService.Java:媒体服务,配合广播实现媒体扫描类的实例化,数据库的初始化等工作,也向外提供接口;
MediaScannerReceiver.Java:一个广播接收器,用于接受系统发给媒体服务的广播并启动媒体服务;
MediaProvider.Java:媒体数据库的封装类,代码量比较大(四千多行),功能比较复杂,但总的来说就是创建数据库,对外提供URI以实现对数据库的增删改查功能;
MediaThumbRequest.Java:媒体文件缩略图请求类,与MediaProvider配合使用;
上一个关系图更直观一些:
上图不是标准的类图,只是为了梳理逻辑关系画的结构图。
MediaProvider所处的位置及作用见图中红色框中的内容;
上图还包括其他内容:
1、App层:audio、image、video如何与媒体库进行交互;
2、框架层(android.media包下):如何实现媒体的扫描;
3、Native层:如何实现正在的媒体文件解析;
4、资源存储层:sd卡、U盘等介质,DTCM存储缩略图;
三、类详解
1、MediaScannerReceiver:
public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Uri uri = intent.getData(); // String externalStoragePath = // Environment.getExternalStorageDirectory().getPath(); String externalSDStoragePath = Environment .getExternalSDStorageDirectory().getPath(); String externalUDiskStoragePath = Environment .getExternalUDiskStorageDirectory().getPath(); String externalExtSDStoragePath = Environment .getExternalExtSDStorageDirectory().getPath(); if (action.equals(Intent.ACTION_BOOT_COMPLETED)) { // scan internal storage scan(context, MediaProvider.INTERNAL_VOLUME); } else { if (uri.getScheme().equals("file")) { // handle intents related to external storage String path = uri.getPath(); if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) { if (externalSDStoragePath.equals(path)) scan(context, MediaProvider.EXTERNAL_VOLUME_SD); else if (externalUDiskStoragePath.equals(path)) scan(context, MediaProvider.EXTERNAL_VOLUME_UDISK); else if (externalExtSDStoragePath.equals(path)) scan(context, MediaProvider.EXTERNAL_VOLUME_EXTSD); else Slog.w(TAG, "unknown volume path " + path); } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) && path != null && (path.startsWith(externalSDStoragePath + "/") || path.startsWith(externalExtSDStoragePath + "/") || path .startsWith(externalUDiskStoragePath + "/"))) { scanFile(context, path); } } } }
三类情况需要启动扫描服务:
a、系统启动完成;
b、媒体挂载(EXTERNAL_VOLUME_SD、EXTERNAL_VOLUME_UDISK、EXTERNAL_VOLUME_EXTSD);
c、媒体文件扫描广播(ACTION_MEDIA_SCANNER_SCAN_FILE);
scanFile和scan方法很简单,只是启动媒体服务即可:
private void scan(Context context, String volume) { Bundle args = new Bundle(); args.putString("volume", volume); context.startService(new Intent(context, MediaScannerService.class) .putExtras(args)); } private void scanFile(Context context, String path) { Bundle args = new Bundle(); Slog.i(TAG, "Start scanFile."); args.putString("filepath", path); context.startService(new Intent(context, MediaScannerService.class) .putExtras(args)); }
2、MediaScannerService:
第一步:启动一个线程
public void run() { // reduce priority below other background threads to avoid interfering // with other services at boot time. Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND + Process.THREAD_PRIORITY_LESS_FAVORABLE); Looper.prepare(); mServiceLooper = Looper.myLooper(); mServiceHandler = new ServiceHandler(); Looper.loop(); }
在线程中拿到当前的消息队列,使用handler处理消息;
第二部:启动ServiceHandler处理消息
ServiceHandler中还是处理两种,一种是扫描,第二种是具体媒体文件的解析;
看一下第二种是如何实现的:
IBinder binder = arguments.getIBinder("listener"); IMediaScannerListener listener = (binder == null ? null : IMediaScannerListener.Stub.asInterface(binder)); Uri uri = scanFile(filePath, arguments.getString("mimetype")); if (listener != null) { listener.scanCompleted(filePath, uri); }
private final IMediaScannerService.Stub mBinder = new IMediaScannerService.Stub() { public void requestScanFile(String path, String mimeType, IMediaScannerListener listener) { if (Config.LOGD) { Log.d(TAG, "IMediaScannerService.scanFile: " + path + " mimeType: " + mimeType); } Bundle args = new Bundle(); args.putString("filepath", path); args.putString("mimetype", mimeType); if (listener != null) { args.putIBinder("listener", listener.asBinder()); } startService(new Intent(MediaScannerService.this, MediaScannerService.class).putExtras(args)); } public void scanFile(String path, String mimeType) { requestScanFile(path, mimeType, null); } };
那么问题来了:如果我们在App中想让系统媒体库解析具体某一个文件,应该怎么做呢?
从上面代码可以看到,MediaScannerService给我们提供的绑定接口,我们只需要传递filepath和一个IMediaScannerListener listener即可,媒体库在解析完之后会回调scanCompleted方法告诉我们解析结果;
第三步:创建MediaScanner对象,完成扫描和解析;
可见具体扫描、解析工作也不是MediaScannerService做的,MediaScannerService是只在调用sacn、acanfile方法时创建了MediaScanner对象并交给他处理;
MediaScanner在android.media.MediaScanner系统framework里面,这儿就不做讨论了;
MediaScannerService基本就这些内容了;
3、MediaProvider:
MediaProvider就是创建数据库,对外提供URI以实现对数据库的增删改查功能;
4、MediaThumbRequest:
Audio、Image、Video文件都是有缩略图的,缩略图路径存储在DB中,其真实文件存储在sd卡的DICM文件夹下,MediaThumbRequest只是提供给MediaProvider类操作数据库使用。
主要的就两个方法,一个新建缩略图方法:execute,一个更新缩略图方法:updateDatabase
新技能get:应用中获取缩略图,期待下一篇文章;
至此,MediaProvider结构分析清楚了,后续计划补两片文章:
APP中使用系统媒体库;
媒体文件扫描、解析是如何实现的;
发表评论
-
SoundPool使用总结
2015-10-09 11:32 13003一、与MediaPlayer的对比: SoundPool适合短 ... -
Android 应用程序发送shell命令
2015-05-04 18:34 12427项目中需要直接在APP中通过发送shell指令来控制lcd灯, ... -
Android应用预置系统
2015-04-22 18:39 7950项目中需要将开发出来 ... -
Android串口通信:基本知识梳理
2015-03-05 09:23 5418在Android开发中,如果涉及到与外设硬件、新设备的通信,往 ... -
Android应用程序防止被LMK干掉
2015-01-09 15:32 4794一、背景:项目中APP需要常驻后台,但Android的LMK( ... -
Android自动挂断来电(ITelephony的使用)
2015-01-08 09:16 14436项目中需要在接收到来电之后把电话挂断,再做一些事情,在研究了A ... -
Android media媒体库分析之:分类别统计媒体文件大小
2014-12-18 15:50 5421对系统媒体库不了解的线看这儿: Android media媒体 ... -
Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描
2014-12-10 15:35 3667之前文章中分析了Android media媒体库,详见:htt ... -
Windows下给Android app进行系统签名
2014-09-02 10:20 21529[size=x-small]在做项目过程中,会碰到部分APP需 ... -
Android事件注入Demo
2014-08-06 11:57 0来自开源网站的例子 -
Android Application 在项目中的妙用
2014-01-15 17:52 3816一、共享全局数据 这个效果就是使用静态变量是一样的,但是其更符 ... -
Android打包生成jar文件
2012-12-17 09:56 2512第一步: cd D:\android-r1\platform- ... -
Android输入法切换引导功能
2012-11-20 14:39 2945在安装百度、搜狗输入法之后,会引导我们设置为当前的输入法,记下 ... -
向系统注入两点触摸事件
2012-11-16 08:42 8682之前遇到的问题:向系统发送一个长按触摸事件,再发送其他触摸事件 ... -
Android 蓝牙手柄开发
2012-11-16 08:54 7096基于Android平台的蓝牙游戏手柄: 1、Android系统 ... -
android调用其他人的so文件
2012-06-06 19:54 3467反编译了一个apk,里面有个so文件,想在自己的程序里面调用, ...
相关推荐
关于Android媒体存储和手机数据库扫描流程以及优化的部分代码贴图
com.android.providers.media.MediaProvider com.android.providers.media.MediaScannerCursor com.android.providers.media.MediaScannerReceiver com.android.providers.media.MediaScannerService ...
自己总结学习MediaProvider的一些重要函数,为了以后学习方便
apk文件 MediaProvider(电视直播视频)apk文件 MediaProvider(电视直播视频)apk文件 MediaProvider(电视直播视频)apk文件 MediaProvider(电视直播视频)apk文件 MediaProvider(电视直播视频)apk文件 ...
这篇文章从系统源代码分析,讲述如何将程序创建的多媒体文件加入系统的媒体库,如何从媒体库删除,以及大多数程序开发者经常遇到的无法添加到媒体库的问题等。本人将通过对源代码的分析,一一解释这些问题。 Android...
7.2.2 MediaStore.Image.Media的query函数分析 7.2.3 MediaProvider的启动及创建总结 7.3 SQLite创建数据库分析 7.3.1 SQLite及SQLiteDatabase家族 7.3.2 MediaProvider创建数据库分析 7.3.3 SQLiteDatabase...
由于现在大多数手机都是带有内存的,原本获取外置SD卡路径的方法Environment.getExternalStorageDirectory() 获取得到的是手机自身内存的根目录。那么我们要怎么来获取到外置SD卡的路径,首先需要A判断是否挂载了sdk...
主要介绍了Android4.4下MediaProvider无法向外置SD卡中文件写数据的解决方法,实例分析了Android4.4下针对读写限制的修改技巧,具有一定参考借鉴价值,需要的朋友可以参考下
Android 获取音乐文件的信息 Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户。
这就需要借助媒体库的内容提供者MediaProvider,通过它,我们不仅可以读取图片,还可以读取视频,音频。 下面我们来看一下媒体库的内容提供者的URI(源码地址) 媒体库Uri 图片MediaStore.Images.Media.EXTERNAL_...
React媒体提供者安装npm install --save react-media-provider 或使用纱线yarn add react-media-provider用法import React from 'react' ;import { render } from 'react-dom' ;import { MediaProvider } from '...
简介:本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner、MediaProvider以及媒体信息解析等部分),包括如何把 APP 新增或修改的文件更新到媒体数据库、如何在多媒体应用中隐藏 APP...
排序媒体查询 对媒体查询进行排序。 安装 npm install sort-media-queries --save 应用程序接口 smq(list, [propertyName]) 返回: Array 将媒体查询排序为字符串或对象列表。 对对象列表进行排序时使用属性参数。...
Android源码的Music应用相关代码不算多,packages/apps/Music是关于UI界面的,\packages\providers\MediaProvider关于数据库的,数据库文件放在data/data/com.android.providers.media, 这里面有两个或更多个.db文件...
media provider源码,原生系统代码,通过ContentProvider实现了数据管理功能。
Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户。当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的...
深入理解android 卷II 第7章 ContentProvider深入理解
快速定位、分析和解决Android系统SELinux相关的权限问题。
从Android 2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位 置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接...