首页 > 学院 > 开发设计 > 正文

ContentProvider补充(获取系统数据)

2019-11-10 19:30:39
字体:
来源:转载
供稿:网友

              之前稍微研究了如何创建并简单使用ContentPRovider来实现共享数据功能。今天补充一下系统提供的ContentProvider是怎么一回事.。当然都是一样的原理,最重要的就是所提供的的网址不同,也就是uri不同。系统中数据无外乎就是一些联系人,信息等,这里在网上找到一些关于联系人与短信的uri,在这里看一下:

     

我们能看到在微信或者QQ上有通过访问手机上联系人来添加好友,就相当于直接在手机这个系统中获取数据。今天研究了下,发现了它们有两种展现方式。

一是直接进入联系人列表然后将所选联系人数据带过来,二呢是将联系人列表里的数据绑进自己的页面。哪个更好呢,当然就视情境而定了。只是哪个更简单

到是可以探究一下。

先说第一种:

         用一个ListView 装数据,首先得写一个自定义的适配器ContactListAdapter,联系人储存在手机这个数据库中,数据字段繁多,我们要想取它得需要为它创建个实体类,接下来也就上次获取数据一样的步骤,具体看代码

//绑定联系人点击事件public void getAllContacts(View view){    setAdapter(list);}/** * 初始化数据库查询参数 */private void init() {    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; // 联系人Uri;    // 查询的字段    String[] projection = { ContactsContract.CommonDataKinds.Phone._ID,            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,            ContactsContract.CommonDataKinds.Phone.DATA1, "sort_key",            ContactsContract.CommonDataKinds.Phone.CONTACT_ID,            ContactsContract.CommonDataKinds.Phone.PHOTO_ID,            ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY };    // 按照sort_key升序查詢    asyncQueryHandler.startQuery(0, null, uri, projection, null, null,            "sort_key COLLATE LOCALIZED asc");}/** * * @author Administrator * */private class MyAsyncQueryHandler extends AsyncQueryHandler {    public MyAsyncQueryHandler(ContentResolver cr) {        super(cr);    }    @Override    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {        if (cursor != null && cursor.getCount() > 0) {            contactIdMap = new HashMap<Integer, ContactBean>();            list = new ArrayList<ContactBean>();            cursor.moveToFirst(); // 游标移动到第一项            for (int i = 0; i < cursor.getCount(); i++) {                cursor.moveToPosition(i);                String name = cursor.getString(1);                String number = cursor.getString(2);                String sortKey = cursor.getString(3);                int contactId = cursor.getInt(4);                Long photoId = cursor.getLong(5);                String lookUpKey = cursor.getString(6);                if (contactIdMap.containsKey(contactId)) {                    // 无操作                } else {                    // 创建联系人对象                    ContactBean contact = new ContactBean();                    contact.setDesplayName(name);                    contact.setPhoneNum(number);                    contact.setSortKey(sortKey);                    contact.setPhotoId(photoId);                    contact.setLookUpKey(lookUpKey);                    Log.i("ccc",photoId+"");                    list.add(contact);                    contactIdMap.put(contactId, contact);                }            }        }        super.onQueryComplete(token, cookie, cursor);    }}private void setAdapter(final List<ContactBean> list) {    adapter = new ContactListAdapter(this, list);    contactList.setAdapter(adapter);}

第二种:

          在这里我们就不需要用ListView来装数据,只需用一个文本框接收从联系人列表传过来的值就ok了。那么,当然我们也不需要再自定义一个适配器,似乎相对来

说这一种方法简单一点了

//跳到联系人列表点击事件public void jumpContacts(View view){    Uri uri=Uri.parse("content://contacts/people");    Intent intent=new Intent(Intent.ACTION_PICK,uri);    startActivityForResult(intent,0);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    switch (requestCode){        case 0:            if(data==null)            {                return;            }            //处理返回的data,获取选择的联系人信息            Uri uri=data.getData();            String[] contacts=getPhoneContacts(uri);            s = contacts[0]+":"+contacts[1];            tv_test_contacts.setText(s);            break;    }    super.onActivityResult(requestCode, resultCode, data);}private String[] getPhoneContacts(Uri uri){    String[] contact=new String[2];    //得到ContentResolver对象    ContentResolver cr = getContentResolver();    //取得电话本中开始一项的光标    Cursor cursor=cr.query(uri,null,null,null,null);    if(cursor!=null)    {        cursor.moveToFirst();        //取得联系人姓名        int nameFieldColumnIndex=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);        contact[0]=cursor.getString(nameFieldColumnIndex);        //取得电话号码        String ContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));        Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + ContactId, null, null);        if(phone != null){            phone.moveToFirst();            contact[1] = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));        }        phone.close();        cursor.close();    }    else    {        return null;    }    return contact;}

通过代码量来看,好像第二种方法较简单了一点,少了将手机数据库中所有的数据获取并绑定出来的这一步,当然早就说了视情境而定,各人有各人的看法了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表