读取机器中的多媒体

来源:互联网 发布:java循环 编辑:程序博客网 时间:2024/04/29 16:55

    在java中,有时候需要遍历一个文件下面的所有文件,可能你会写一个迭代的方法来得到所有文件,比如:

public static void prinFilePath(File sourceFile) throws Exception {System.out.println(sourceFile.getAbsolutePath());if (sourceFile.isFile()) {System.out.println(sourceFile.getAbsolutePath());} else {File[] fs = sourceFile.listFiles();for (File f : fs) {prinFilePath(f);}}}

    这样写是比较费时的,在移动应用中这可能不能满足实际的需求,那么在android中提供了一种更好的方法,来得到资源文件,就是读取数据库。有时候我们需要读取机器中的多媒体文件,比如要读取图片文件.jgp、.png、.bmp等等,可能有些应用还需要得去机器中的视频音频文件,如.rmvb、.MP4、.wma等等,这样我们可以去查询机器中存在的多媒体数据库。

    连接机器,进入shell环境,敲入“ls data/data”,可以看到很多应用的入口包名,比如“com.android.browser”是浏览器的数据库,“com.android.email”是邮件的数据库,还有一些配置文件的数据库也在其中,比如“com.android.settings”等等,我们都可以导出来看看数据库的结构,因为我以前做过浏览器的一些修改,所以就拿浏览器为例,导出浏览器的数据库(在Eclipse中的DDMS界面的一个File Explorer界面,在com.android.browser.databases中,我的里面有三张表,导出名字为browser.db就行了),然后查看数据库的表,我用的工具是sqliteman,他是专门用来查看android里面嵌入的数据库表的工具,网上有很多可以免费下载的。然后我们可以看到标签栏里面有很多记录,其中字段title、url等等,有兴趣的都可以自己去操作一下,现在我们需要导出的数据库是com.android.providers.media下面的databases中的external.db数据库,然后打开你就可以看到很多表,我相信当你打开之后,看到表明你就可以明白这张表是干什么用的,呵呵,因为名字都很简单,一看就能明了的,我们锁定到iamges表,可以看到很多这张图片的信息,有_size、mime_type、title等等一些属性。

    好了,找到数据库,了解了一些数据库里面的东西,我们现在来查询该数据库,代码如下:

Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] {MediaStore.Images.Media.DATA}, null, null, null)
    查找到我们需要的数据之后,使用游标的方法可以到处数据

 while (cursor != null && cursor.moveToNext()) {String path = cursor.getString(cursor.getColumnIndex("_data"));Bitmap bitmap = BitmapFactory.decodeFile(path);}
    这样我们就得到了一张图片的Bitmap对象,然后转换成我们需要的各种图片(关于转换成其他图片,请看我的关于图片处理的博客)。

    好了,到这里我们得到了图片,但有时候应用又会有这样的需求,那就是我得到了图片的Uri,但是当我用完图片资源之后,图片对象不见了,我只保留了图片的Uri,也可能是改图片在几个界面之后共享了,传递数据时,只传递了图片的Uri,而很多时候,在程序中代表图片的Uri并不一定是图片的真是地址,也可能是图片存放在数据库中的地址,两种地址是不一样的,那这样我们如何得到该Uri所对应的图片的真是地址呢?看代码:

/** * @author ZYJ * @功能 从图片的Uri中得到真正的图片地址 * @param uri *            图片uri * @return 返回图片真正地址的字符串类型 */private String getRealPathFromUri(Uri uri) {/* * 首先进行查询字段,将Uri作为已知条件,得到数据库中的"_data"(真实地址)字段 */String[] proj = {MediaStore.Images.Media.DATA};Cursor actualimagecursor = managedQuery(uri, proj, null, null, null);/* * 查询出来的该Uri所对应的图片在数据库中的行索引 */int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);actualimagecursor.moveToFirst();String img_path = actualimagecursor.getString(actual_image_column_index);return img_path;}
    这样我们就得到了一个Uri所对应的真是地址了,当然,我写的这个方法还有一些意外情况,比如Uri为null,或者查询不到结果等等,可以自己的填补一下额。。。