ContentProvider之通过ContentResolver获取图像、视频、音频举例

Android媒体文件读取
本文介绍如何使用Android的MediaStore和ContentResolver接口来查询设备上的图像、视频和音频文件。通过具体的代码示例展示了如何获取这些媒体文件的信息,并列举了所使用的数据表格和字段。

MediaStore中定义了一系列的数据表格,通过ContentResolver提供的查询接口,我们能够得到各种须要的媒体信息。

通过下面两个URI能够扫描设备外部和内部的媒体文件

Android系统提供了MediaProvider,MediaStore,MediaScanner接口,通过Content Provider的方式提供给用户。

下面是一个简单的样例:(注意。项目使用AndroidAnnotation框架)

package com.example.testaa;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.widget.Button;
import android.widget.TextView;
/*
 *@author: ZhengHaibo  
 *web:     http://blog.youkuaiyun.com/nuptboyzhb
 *mail:    zhb931706659@126.com
 *2014-4-15  Nanjing,njupt,China
 */
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

	@ViewById
	Button getImage;

	@ViewById
	Button getVideo;

	@ViewById
	Button getAudio;

	@ViewById
	TextView myTextView;

	/**
	 * 载入完View之后进行的处理
	 */
	@AfterViews
	void afterViewProcess() {

	}

	/**
	 * 获取图像列表
	 */
	@Click
	void getImage() {
		String[] projection = { MediaStore.Images.Media._ID,
				MediaStore.Images.Media.DISPLAY_NAME,
				MediaStore.Images.Media.DATA };
		String orderBy = MediaStore.Images.Media.DISPLAY_NAME;
		Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
		getContentProvider(uri,projection, orderBy);
	}

	/**
	 * 获取视频列表
	 */
	@Click
	void getVideo() {
		// TODO Auto-generated method stub
		 String []projection = { MediaStore.Video.Media._ID,  
                 MediaStore.Video.Media.DISPLAY_NAME,  
                 MediaStore.Video.Media.DATA}; 
		String orderBy = MediaStore.Video.Media.DISPLAY_NAME;
		Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
		getContentProvider(uri,projection, orderBy);
	}

	/**
	 * 获取音频列表
	 */
	@Click
	void getAudio() {
		String []projection = { MediaStore.Audio.Media._ID,  
                MediaStore.Audio.Media.DISPLAY_NAME,  
                MediaStore.Audio.Media.DATA,  
                MediaStore.Audio.Media.SIZE}; 
		String orderBy = MediaStore.Audio.Media.DISPLAY_NAME;
		Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
		getContentProvider(uri,projection, orderBy);
	}
	
	/**
	 * 获取ContentProvider
	 * @param projection
	 * @param orderBy
	 */
	public void getContentProvider(Uri uri,String[] projection, String orderBy) {
		// TODO Auto-generated method stub
		List<HashMap<String, String>> listImage = new ArrayList<HashMap<String, String>>();
		Cursor cursor = getContentResolver().query(uri, projection, null,
				null, orderBy);
		if (null == cursor) {
			return;
		}
		while (cursor.moveToNext()) {
			HashMap<String, String> map = new HashMap<String, String>();
			for(int i=0;i<projection.length;i++){
				map.put(projection[i], cursor.getString(i));
				System.out.println(projection[i]+":"+cursor.getString(i));
			}
			listImage.add(map);
		}
		myTextView.setText(listImage.toString());
	}

}

项目下载地址: http://download.youkuaiyun.com/detail/nuptboyzhb/7220227

扩展阅读:

【1】http://blog.youkuaiyun.com/gaomatrix/article/details/6216880

【2】http://developer.android.com/reference/android/content/ContentProvider.html

获取ContentProvider的内容通常需要经过以下几个步骤: 1. **创建ContentResolver对象**:首先,在Android应用中,你需要通过`Context`实例创建一个`ContentResolver`对象。这是访问系统或自定义ContentProvider的入口。 ```java ContentResolver resolver = context.getContentResolver(); ``` 2. **构建Uri**: 根据你想要查询、插入、更新或删除的数据源,构造一个`Uri`对象。这通常是ContentProvider的URI形式,例如 `content://your_provider_authority/path`. 3. **选择器(Query Builder)**: 如果你想从ContentProvider中查询数据,可以使用`CursorLoader`或者直接使用`query()`方法并传递一个`Uri`,以及一组列名和筛选条件(如`where` clause)。 ```java Cursor cursor = resolver.query(Uri, projection, selection, selectionArgs, sortOrder); ``` 4. **处理结果**:如果查询成功,你可以遍历`Cursor`来获取内容。记得关闭`Cursor`以释放资源。 5. **执行其他操作**:对于插入、更新和删除操作,分别使用`insert()`, `update()`, 和 `delete()` 方法,并提供相应的`Uri`、值数组等参数。 ```java ContentValues values = new ContentValues(); values.put("column_name", "value"); resolver.insert(Uri, values); // 插入 resolver.update(Uri, values, selection, selectionArgs); // 更新 resolver.delete(Uri, selection, selectionArgs); // 删除 ``` 6. **异常处理**:在处理过程中可能会抛出异常,比如权限不足或ContentProvider不存在等,要及时捕获并处理。 记得在完成操作后关闭连接,并确保处理所有异常情况,以便保持代码健壮。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值