读取机器中的多媒体

    在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,或者查询不到结果等等,可以自己的填补一下额。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值