Android如何通过contentprovider构建媒体文件数据库_第1页
Android如何通过contentprovider构建媒体文件数据库_第2页
Android如何通过contentprovider构建媒体文件数据库_第3页
Android如何通过contentprovider构建媒体文件数据库_第4页
Android如何通过contentprovider构建媒体文件数据库_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、An droidprovider如何通过 content 构建媒体文件数据库An droid如何通过content provider构建媒体文 件 数据库An droid为Camera, Audio , Video等媒体文件提供MediaProvider用于数据的保存, 删除,检索等。MediaProvider实现了 Content Provider类的几个操 作SQL的重要方法如 insert ,delete, updata, queryo MediaProvider 中 DatabaseHelper类用于获取与创建Databaseoprivate static final class Da

2、tabaseHelper exte nds SQLiteOpe nHelp er final Con text mCon text;final boolean mlnternal; / True if this is the internal database/ In memory caches of artist and album dataHashMap mArtistCache = new HashMap0;HashMap mAlbumCache = new HashMap0;public DatabaseHelper(C on text con text, Stri ng n ame,

3、 boolea n inte rnal) super(c on text, name, null, DATABASE_VERSION);mCon text = con text;mln ternal 二 in ternal;* Creates database the first time we try to open it.*/Override /第次打开数据库时创建Tablepublic void on Create(fi nal SQLiteDatabase db) updateDatabase(db, mln ternal, 0, DATABASE_VERSION);以Camera的i

4、mage文件文件为例,数据库在第一次使用的时候被创建,对 于 image 文彳牛,SQL在updateDatabase为其仓U建个table :db. execSQL(CREATE TABLE IF NOT EXISTS images ( +id INTEGER PRIMARY KEY, + / 文件保存的序号,z_data TEXT, ” + / i己录 image 文件保存路径size INTEGER,,z + / 文件大小z,_display_name TEXT,,z + / 图片名称z,mime_type TEXT, + / 文件类型title TEXT, +,zdate_added

5、INTEGER,,z +z/date_modified INTEGER,/z +z,description TEXT, +z,picasa_id TEXT, ” +isprivate INTEGER, ” +latitude DOUBLE, /z +lo ngitude DOUBLE, ” +datetake n INTEGER, +,zorie ntation INTEGER,,z +mi ni_thumb_magic INTEGER, +z,bucket_id TEXT, ” +z,bucket_display_name TEXT +););添加URI到match这个也很重要,因为不同类型

6、的文件会保存在不同的 ble 中,如果我们得到个 URI 为:content:/media/external/images/medi a/1 通过 UriMatcher. match (uri)彳各返 回注册的 IMAGES_MEDIA_I 值。URIJIATCHER. addURI (media, Vimages/media, IMAGES_MEDIA);URIJIATCHER. addURI(media, */images/media/#,IMAGES_MEDIA_I D);CRI格式解析如下:URI格式中最重要的字段是authority , authority确立了操作数据库的Pr ov

7、ider是 由谁提供的。MediaProvider AndroidManifest. xml中添加如卜语句:Provider 力I载MediaProvider安装在手机中,ContentResolver 通过 acquireProvider 请 求力口载Provider程疗;。acquireProvider正是通过解析IRI中的authority字 段,在安装的package 中查找与此authority相符的Provider,如杲此Provid er没有被加载ActivityMangerService将加载Provider程疗:,这个过程可以参 考我以前写的Activity是如何加载的文章。

8、 Provider到底是加载到调用Prov ider的应用程序还是将Provide!程疗;加载至U ActivityManagerService中作为system Provider这个我不太确定是如何区分的,反正这两种方式都是可行的,总之按照sdk help文档上的方式创建Provider程序,an droid会自动加载的。记录的保存与获取-Z| Camera拍照完成或者是media play文件需要保存的时候,首先要构造保存的数 据结构Conten tValues values = new Con te ntValues(7);values put(Images. Media TITLE,

9、imageName);values put(Images Media DISPLAY_NAME, imageXame);values put(Images Media DESCRIPTION, descriptio n);values put(Images Media DATE_TAKEX, dateTake n);values put(Images Media MIME_TYPE, image/jpeg);保存到数据库valuesput(Images. Media. ORIENTATION, orie ntatio n);Uri uri = cr. in sert(sStorageURI,

10、values); /sStorageURI = con te nt:/media/external/sdcard/media/Authority 是 media 所以将调用 MediaProvider: :insert ,在 insert 中生成文件保存 的路径并放在key为_data项数据区。再通过ContentResolver访|可MediaProvider调用 openFile扌开文件并将Image或media数据写入。Camera Image gallery应用启动后不会扫描文件系统而是根据数据库的记录來进行 列表并显示。这样做无疑效率比较高。文件的删除数据库中保存有文件的路径名,当调

11、用delete从数据库中删除一个记录后,记 录中_data保存的文件名(绝对路径)所指的文件也被删除了。而在应用程序中是找不 到删除文件的代码,这个困扰了我两天,在程序中加log,分析源代码,最终屏蔽MediaProvider中的一段代码找到了一点线索:public int delete(Uri uri, Stri ng userWhere, Strin g whereArgs)int count;irrt match = URI_MATCHER. match (uri);辻(match != VOLUMES_ID) DatabaseHelper database = getDatabaseF

12、orUri (uri);if (database 二二 n ull) throw new Un supportedOperati on Excepti on(Unknown URI: + uri);SQLiteDatabase db = databasegetWritableDatabase();syn chro ni zed (sGetTableA ndWhereParam) getTableAndWhere(uri, match, userWhere, sGetTableAndWhereParam);switch (match) case AUDIOJEDI A:case AUDIO_ME

13、DIA_ID:count = db. delete (/audio_meta,sGetTableA ndWhereParam. where, whereArgs);break;default:/ count 二 db.delete (sGetTableA ndWhereParam. table,/ sGetTableA ndWhereParam.where, whereArgs);break;getC on text (). getC onten tResolver () no tifyCha nge (uri, n ull);将上面红色代码注掉以后发现文件没有被删除,而红色代码只是对数据库

14、进行操作,因而文件应该是在清除数据库的记录时候被删除的。able的代码发现几个语句很奇怪,由于没有网络去搜索一下关于仔细查看创建tan droidSQL的knowledge只能猜测这个语句的意思了当然也怪偶没去学学SQLdb. execSQL(CREATE TRIGGER IF NOT EXISTS images_clea nup DELETE 0 N images +BEGIN ” + DELETE FROM thumb nails WHERE image_id = old._id; +SELECT _DELETE_FILE (old. _data) ;,z +END);仓ll建 table

15、 为 images 的触发器,DELETE FROM thumb nails WHERE image_ id = old.d 正是 删除thumb nails的意思,对于Camera创建的Images会生成一个小图片保存为thumb nail,这个记录也是自动清除的。SELECT _DELETE_FILE (old. _data);应该是删除文件的意思。lit Sqlite3_android. cpp文件中还真找到delete_file 这个函数,加上log,进入gallery选择一个文件删除,打出了删除文件名禹全路径。static void delete_file(sqlite3_c on

16、text * con text, i nt argc, sql ite3_value * argv)辻(strncmp (z,/sdcard/,/, path, 8) != 0) /只能册!除 sdcard/ 路径卜的东西要删除其他路sqlite3_result_null (co ntext) ; /还需稍微改造一* 卜return;如何将文件保存在手机上MediaProvider中存在两个数据库一个是external对应文件系统为SD Car d,个是内 部数据库internal用于手机flash上的文件系统。遗憾的是虽然M ediaPtovider提供了操作 内外两个数据库的功能,但在发布

17、的应用中并没有使用这个内部文件系统。An droid默 认状态卜Image, audio等文件是保存在SD card上。External, internal数据库都保存在手机 文件系统上Path: /data/data/com. a ndroid. providers, media/database/函数如果要使用内部文件系统需要修改以下几个地方1: MediaProvider generateFileNameprivate Stri ng gen erateFileName(boolea n intern al, Stri ng preferr edExte nsion, Stri ng d

18、irectoryName)/ create a ran dom fileStri ng n ame = Stri ng. valueOf(System. curre ntTimeMillis();if (intern al) throw new Un supportedOperati on Excepti on CWrit ing to internal sto rage is not supported. “);/ return Environmen tgetDataDirectory ()/ + / + directoryName + / + n ame + preferredExte nsio n; else retur n En vir onmen tgetExter nalStorageDirectory ()+ / + directoryName + n ame + preferredExte nsion;2:保存文件使用的URI为恢复红色部分代码,将路径设置为手机内部文件系统文件夹。content:/media/internal/images/media/1红色internal农名使用内部文件系统数据库3:修改Sqlite3_android cpp中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论