通讯录的联系人操作(CRUD)

1.联系人操作:

  • 实现思路:
    • 使用到ContentProvider
    • 调用context的getContentResolver()方法,得到resolver
    • 再调用resolver的CRUD方法
  • 参考官方文档:API Guides–>Content Providers–>Contacts Provider
1.1 查询联系人
1.1.1查询方式:
  • 方式一:根据字段在数据库中查询

    • 需要查询两个表:
      • raw_contacts表:uri: content://com.android.contacts/raw_contacts
      • data表:uri: content://com.android.contacts/data
    • 步骤:
      1. 先从raw_contacts表中查出contact_id,此时,创建javabean对象
      2. 然后在data表中根据contact_id去查询data1和mimetype;
      3. 根据mimetype(具体可查看contacts2.db)设置javabean的变量值
      4. 将javabean添加到集合中,返回list集合
  • 方式二:利用封装的API

    • 思路:
      • 使用ContactsContract类(android.provider包)
      • CommonDataKinds为内部类
    • 步骤:

      1. 获取查询的Uri:调用ContactsContract.CommonDataKinds.Phone的CONTENT_URI
      2. 编写需要返回的字段数组(DISPLAY_NAME,NUMBER,CONTACT_ID)
      3. 调用的resovler的query,得到cursor
      4. 根据下标,获取cursor的字段,并保存到javabean中
      5. 关闭cursor
      6. 将javabean添加到集合中,并返回
    • 获取联系人的头像:

      1. 获取uri:
        Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, contactId);
      2. 调用ContactsContract.Contacts的openContactPhotoInputStream,获取流
      3. 将输入流解析成Bitmap
1.1.2 启动系统自带的联系人界面,并返回选择的结果
  • 思路:

    • 查看上层应用源码的清单配置文件

      <activity android:name="ContactsListActivity"
              android:label="@string/contactsList"
              android:clearTaskOnLaunch="true">
          <intent-filter>
               <action android:name="android.intent.action.PICK" />
               <category android:name="android.intent.category.DEFAULT" />
               <data android:mimeType="vnd.android.cursor.dir/contact" />
               <data android:mimeType="vnd.android.cursor.dir/person" />
               <data android:mimeType="vnd.android.cursor.dir/phone_v2" />
               <data android:mimeType="vnd.android.cursor.dir/phone" />
               <data android:mimeType="vnd.android.cursor.dir/postal-address_v2" />
               <data android:mimeType="vnd.android.cursor.dir/postal-address" />
          </intent-filter>
      </activity>
    • 调用android.intent.action.PICK
      • 扩展:
        • 查找视频:intent.setType(“video/*”);
        • 查找图片:intent.setType(“image/*”); 此处调用的是系统的图库,返回的data为uri
    • 发现返回的结果是一个uri,故根据uri去查询相应的数据即可
  • 实现步骤:

    1. 添加读取联系人的权限,由于此处是通过uri去查询信息

      public void addClick(View v){
          //点击启动系统的联系人界面,等待结果返回
          Intent intent = new Intent();
          intent.setAction(Intent.ACTION_PICK);
          intent.setType("vnd.android.cursor.dir/phone_v2");
          startActivityForResult(intent, REQUEST_CODE_NUMBER);
      }

      2.获取返回的结果

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          //点击某个联系人后,有结果返回,data不为null,resultCode = -1
          //未点击联系人,直接取消,data为null,resultCode = 0
          Log.d(TAG, "resultCode="+resultCode+"---data="+data);
      
          if (data != null) {
      
              Uri uri = data.getData();
      
              String[]projection = {
                      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                      ContactsContract.CommonDataKinds.Phone.NUMBER
              };
      
              Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
      
              if (cursor.moveToNext()) {
                  String number = cursor.getString(1);
                  mTv_number.setText(number);
                  //将光标置于最后
                  mTv_number.setSelection(number.length());
              }
          }
      }

1.2 添加联系人

1.2.1 逐条添加
  • 思路:

    • 先向raw_contact表添加数据
    • 在向往data表添加数据(姓名,号码,邮箱等)
  • 实现步骤:

    1. 先获取输入项,获取raw_contact表和data表的Uri
    2. 得到ContentResolver对象
    3. 按降序查询数据库中的最后一个id值,如果数据库中有记录,将id值+1;没有记录就赋值为1
    4. 根据id往data表中添加数据(key和alue值参考contacts2.db的data表)
  • 说明:

    • 关于添加时id的获取:可以调用ContentUris的parseId(API 23新增)
      long contactid = ContentUris.parseId(resolver.insert(uri, values));
  • 示例:

    public void add(View v){
        String name = et_name.getText().toString().trim();
        String phone = et_phone.getText().toString().trim();
        String email = et_email.getText().toString().trim();
    
        //执行添加操作
        ContentResolver resolver = getContentResolver();
    
        Uri contactUri = Uri
                .parse("content://com.android.contacts/raw_contacts");
        Uri dataUri = Uri.parse("content://com.android.contacts/data");
    
    
        // 往 raw_contact表添加数据
        ContentValues values = new ContentValues();
        Cursor cursor = resolver.query(contactUri, new String[]{"_id"}, null, null, "_id DESC");
        int id = 1; // 预先指定这个id 是1 , 
        if(cursor.moveToNext()){
            //如果数据库里面已经存在了记录,那么就去替换早前的id数值
            id  =  cursor.getInt(cursor.getColumnIndex("_id"))+1;
        }
        values.put("contact_id", id);
        resolver.insert(contactUri , values);
    
    
        //往data表添加数据
        //添加姓名
        ContentValues nameVal = new ContentValues();
        nameVal.put("data1", name);
        nameVal.put("raw_contact_id", id);
        nameVal.put("mimetype", "vnd.android.cursor.item/name");
        resolver.insert(dataUri, nameVal);
    
        //添加手机号码
        ContentValues phoneVal = new ContentValues();
        phoneVal.put("data1", phone);
        phoneVal.put("raw_contact_id", id);
        phoneVal.put("mimetype", "vnd.android.cursor.item/phone_v2");
        resolver.insert(dataUri, phoneVal);
    
        //添加邮箱
        ContentValues emailVal = new ContentValues();
        emailVal.put("data1", email);
        emailVal.put("raw_contact_id", id);
        emailVal.put("mimetype", "vnd.android.cursor.item/email_v2");
        resolver.insert(dataUri, emailVal);
    
        Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
    }
1.2.2 批量添加
  • 示例:

    //批量添加
    public void addAllContact() throws Exception{
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        ContentResolver resolver = getContext().getContentResolver();
        ArrayList<contentprovideroperation> operations = new ArrayList<contentprovideroperation>();
        ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri)
            .withValue("account_name", null)
            .build();
        operations.add(op1);
    
        uri = Uri.parse("content://com.android.contacts/data");
        //添加姓名
        ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri)
            .withValueBackReference("raw_contact_id", 0)
            .withValue("mimetype", "vnd.android.cursor.item/name")
            .withValue("data2", "小花")
            .build();
        operations.add(op2);
    
        //添加电话号码
        ContentProviderOperation op3 = ContentProviderOperation.newInsert(uri)
            .withValueBackReference("raw_contact_id", 0)
            .withValue("mimetype", "vnd.android.cursor.item/phone_v2")
            .withValue("data1", "10088")
            .withValue("data2", "2")
            .build();
        operations.add(op3);
    
        resolver.applyBatch("com.android.contacts", operations);
    }
    

1.3 删除联系人

  • 思路:

    • 根据姓名在raw_contacts表查出id;
    • 在data表中只要raw_contact_id匹配的都删除;
  • 示例:

    public void delete() throws Exception{  
        String name = "小花";  
        //1.根据姓名查找id  
        Uri contactUri = Uri.parse("content://com.android.contacts/raw_contacts"); 
        Uri dataUri = Uri.parse("content://com.android.contacts/data");
        ContentResolver resolver = getContext().getContentResolver();  
        Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null);  
        if(cursor.moveToFirst()){  
            int id = cursor.getInt(0);  
            //删除raw_contacts中的数据
            resolver.delete(contactUri, "display_name=?", new String[]{name});  
            uri = Uri.parse("content://com.android.contacts/data");  
            //2.根据id删除data表中的相应数据
            resolver.delete(dataUri, "raw_contact_id=?", new String[]{id+""});  
        }  
    }

1.4 修改联系人

  • 思路: 不需要更新raw_contacts,只需要更新data表
  • 示例:修改电话号码

    public void update()throws Exception{
        int id = 1;
        String phone = "10089";
        Uri uri = Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作
        ContentResolver resolver = this.getContext().getContentResolver();
        ContentValues values = new ContentValues();
        values.put("data1", phone);
        resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2",id+""})
    } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值