Days14 ContentProvider & ContentResolver

********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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值