********ContentResolver
ContentResolver(操作A应用暴露的数据)相当于客户端
外界的程序可以通过ContentResolver来访问ContentProvider暴露的数据
备注:
1、URI, URL,Url,URN的区别???
2、Uri:Uri是ContentProvider 和 ContentResolver进行数据交换的标识
3、name在6.0以上版本读不出来
4、如下例,需要添加READ_CALL_LOG权限
5、Cursor中的new String[]{…}不能随便写,跟需要查询对应数据的字段名一致
6、系统内置的预定义ContentProvider:
a、Contacts:获取、修改、保存联系人的信息;
b、MediaStore:访问声音、视频、图片等多媒体文件;
c、CallLog :查看或更新通话记录;
d、Browser:读取或修改浏览历史、网络搜索、书签;
e、Setting:查看和 获取蓝牙设置、铃声设置等设备首选项。
f、SMS:短信
//通过context的getContentResolver()方法获取ContentResolver对象
resolver = getContentResolver();
//通过Uri的静态方法parse()将一个字符串转换成Uri对象
Uri uri = Uri.parse("content://call_log/calls");
//通过ContentResolver对象的query()方法查询相应的数据,返回一个Cursor对象
Cursor cursor = resolver.query(uri, new String[] { "_id", "name",
"number", "date", "type" }, null, null, null);
//通过Cursor对象构建SimpleCursorAdapter,给ListView使用
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.list_item, cursor, new String[] { "name", "number",
"date", "type" }, new int[] { R.id.txtName,
R.id.txtNumber, R.id.txtDate, R.id.txtType },
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lvCallLog.setAdapter(adapter)
设置ListView的条目点击监听,点击具体条目,播放对应音频
**备注:**1、添加SDCard读写权限WRITE_EXTERNAL_STORAGE
resolver = getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
cursor = resolver
.query(uri, new String[] { Media._ID, Media.DISPLAY_NAME,
Media.DATA, Media.TITLE }, null, null, null);
adapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor,
new String[] { Media.DISPLAY_NAME, Media.DATA, Media.TITLE },
new int[] { R.id.txtName, R.id.txtData, R.id.txtTitle },
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lvShow.setAdapter(adapter);
//给ListView设置条目点击监听,当具体的条目被点击,则播放该条目的音频数据
lvShow.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//获取被点击条目,(因为适配器本身就是通过Cursor对象构建的适配器,故可强转)并将其强转为Cursor对象
Cursor c = (Cursor)parent.getItemAtPosition(position);
//获取Cursor对象中字段名为Media.DATA中的数据(当前文件的目录+文件名)
String path = c.getString(c.getColumnIndex(Media.DATA));
//使用隐式启动,播放指定文件
Intent intent = new Intent(Intent.ACTION_VIEW);
//Uri.fromFile()方法???
intent.setDataAndType(Uri.fromFile(new File(path)), "audio/*");
startActivity(intent);
}
});
将联系人的号码和邮箱读取出来并显示在ListView上
备注:1、需要添加android读写联系人,读和写权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
另附上android权限大全:转载自:http://zhidao.baidu.com/link?url=U8z9IztiiaFokwI1wxgthiCmrUroS2NznI4JeHz7E-CQrYGSp-gybb4_5e4NlwDMsVPDeysQxq5kiaR3roflZtMHgcNqDe0NbP9RogYRtum
2、从raw_contacts表中获取联系人的id和联系人的姓名
获得数据集合代码:
private List<Map<String, String>> getContactsList() {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Cursor cursor = resolver.query(Uri.parse(uri_contacts), new String[] {"_id", "display_name" }, null, null, null);
while (cursor.moveToNext()) {
Map<String, String> map = new HashMap<String, String>();
String id = cursor.getString(0);
String display_name = cursor.getString(1);
map.put("id", id);
map.put("display", display_name);
//根据每个联系人的id再去data表中查找相应的电话号码
Cursor cursorPhone = resolver.query(Uri.parse(uri_contacts_phones),
new String[] { "data1" }, "raw_contact_id = ?",
new String[] { id }, null);
StringBuffer sbPhone = new StringBuffer();
//有可能此联系人有不止一个号码
while (cursorPhone.moveToNext()) {
sbPhone.append(cursorPhone.getString(0)).append("|");
}
map.put("phone", sbPhone.toString());
//手动关闭Cursor对象,否则不会被回收,可提高性能,另外:若等到垃圾回收器来回收时,如果未手动关闭,系统会报错
cursorPhone.close();
cursorPhone = null;
//根据每个联系人的id再去data表中查找相应的邮箱
Cursor cursorEmail = resolver.query(Uri.parse(uri_contacts_emails),
new String[] { "data1" }, "raw_contact_id = ?",
new String[] { id }, null);
StringBuffer sbEmail = new StringBuffer();
//有可能此联系人有不止一个邮箱
while (cursorEmail.moveToNext()) {
sbEmail.append(cursorEmail.getString(0)).append("|");
}
map.put("email", sbEmail.toString());
cursorEmail.close();
cursorEmail = null;
list.add(map);
}
return list;
}