对于手机通讯录的增删改查操作。

废话就不多说了,主要用到了ContentProvider的相关知识。

//这是一个工具类,主要是将联系人的Name,phone ,email,address,放到List集合中。

package com.example.contact_content_provider;

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

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;

public class ContactUtils  
{
    public static List<Map<String, Object>> getContactList(ContentResolver resolver)
    {
        List<Map<String, Object>>list=new ArrayList<Map<String,Object>>();
        //对应表  raw_contacts
         String contactUriStr="content://com.android.contacts/raw_contacts";//帮助理解
         Uri contactUri=ContactsContract.Contacts.CONTENT_URI;
         //对应data表
         String dataUriStr="content://com.android.contacts/data";
        //联系人电话
         String phoneUriStr="content://com.android.contacts/data/phones";
          Uri  phoneUri=ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
          //联系人email;
          String emailUriStr="content://com.android.contacts/data/emails";
          Uri emailUri=ContactsContract.CommonDataKinds.Email.CONTENT_URI;
          //联系人的地址:
          String addressUriStr="content://com.android.contacts/data/postals";
          Uri  addressUri=ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI;
          Cursor contactCursor=resolver.query(contactUri, new String []{"_id","display_name"}, null, null, null);
          while (contactCursor.moveToNext())
            {
                int contactId=contactCursor.getInt(0);
                String display_name=contactCursor.getString(1);
                Map<String , Object>map=new HashMap<String, Object>();
                map.put(ContactsContract.Contacts.DISPLAY_NAME,display_name);
                map.put(ContactsContract.Contacts._ID, contactId);
                //查询联系人电话
                Cursor phoneCursor=resolver.query(phoneUri, null, "raw_contact_id=?", new String []{contactId+""}, null);
                String phone="";
                while(phoneCursor.moveToNext())
                    {
                        phone=phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
                    }
                map.put("phone", phone);
                //查询联系人的邮箱
                Cursor emailcCursor=resolver.query(emailUri, null, "raw_contact_id=?", new String []{contactId+""}, null);
                String email="";
                while(emailcCursor.moveToNext())
                    {
                        email=emailcCursor.getString(emailcCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                        
                    }
                map.put("email", email);
                Cursor addCursor=resolver.query(addressUri, null, "raw_contact_id=?", new String [] {contactId+""}, null);
                String address="";
                while(addCursor.moveToNext())
                    {
                        address=addCursor.getString(addCursor.getColumnIndex("data1"));
                    }//上面的ContactsContract.CommonDataKinds.Email.DATA/phone  都可以用data1代替
                map.put("address", address);
                list.add(map);
            }
        return list;
    }
}

 


------------------------------------------------------------------------------------------------

自定义适配器,继承了BaseAdapter。重写里面的四个方法。从而达到自己想要的布局。

这个东西很简单,就不做过多的解释了。

package com.example.contact_content_provider;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.provider.ContactsContract.Contacts;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter  extends BaseAdapter
{
  ViewHolder holder;
  private List<Map<String, Object>>list;
  LayoutInflater inflater;
  public MyAdapter(Context context,List<Map<String, Object>>list)
  {
      inflater=LayoutInflater.from(context);
      this.list=list;
      
  }
    @Override
    public int getCount()
    {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int arg0)
    {
        // TODO Auto-generated method stub
        return list.get(arg0);
    }

    @Override
    public long getItemId(int arg0)
    {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2)
    {
        
        if (arg1==null)
            {
                holder=new ViewHolder();
                arg1=inflater.inflate(R.layout.item, null);
                holder.tvname=(TextView)arg1.findViewById(R.id.tv_name);
                holder.tvphone=(TextView)arg1.findViewById(R.id.tv_phone);
                holder.tvemail=(TextView)arg1.findViewById(R.id.tv_email);
                holder.tvaddress=(TextView)arg1.findViewById(R.id.tv_address);
                arg1.setTag(holder);
            }else {
                holder=(ViewHolder)arg1.getTag();
            }
         holder.tvname.setText(list.get(arg0).get("display_name").toString());
         holder.tvphone.setText(list.get(arg0).get("phone").toString());
         holder.tvemail.setText(list.get(arg0).get("email").toString());
         holder.tvaddress.setText(list.get(arg0).get("address").toString());
        return arg1;
    }
     class ViewHolder
     {
         TextView tvname,tvphone,tvemail,tvaddress;
     }
}

 


------------------------------------------------------------------------------------------------

这是主函数 ,里面的各项操作我已经做了详细的注释。

-------------------------------------------------------------------------------------------------------

package com.example.contact_content_provider;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import android.R.integer;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity 
{
   private MyAdapter adapter;
   private ListView listView;
   private List<Map<String, Object>>dataList;
   ContentResolver resolver; //数据解析器
   boolean flag=true;//设置标志位 判断是进行添加还是修改操作
   private AlertDialog edDialog,delDialog;  //初始化对话框
   private EditText ed_name,ed_phone,ed_email,ed_address;  //初始化对话框里的编辑项
   int  position;  //取到长按时ListView所在的位置
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
    
        inInDialog();
        
    }
      //初始化视图
     public void initData()
     {
         listView=(ListView)findViewById(R.id.lv_showContacts);
         resolver=getContentResolver();
         dataList=new ArrayList<Map<String,Object>>();
        // dataList=ContactUtils.getContactList(resolver);
         adapter=new MyAdapter(this, dataList);
         listView.setAdapter(adapter);
         registerForContextMenu(listView);
     }
     //为搜索按钮设置监听事件
     public void queryContacts(View v)
     {
         List<Map<String, Object>>list=ContactUtils.getContactList(resolver);
         dataList.clear();//不进行此操作的时候会使联系人重复出现
         dataList.addAll(list);
         adapter.notifyDataSetChanged();//数据有变动时,执行唤醒操作,告诉数据库,我变了
     }
     public void addContacts(View v)
     {
         flag=true;
         ed_address.setText("");
         ed_email.setText("");
         ed_name.setText("");
         ed_phone.setText("");
         edDialog.show();
     }
     //初始化对话框
      public void inInDialog()
      {
          View view=getLayoutInflater().inflate(R.layout.dialog_edit, null);
          ed_name=(EditText)view.findViewById(R.id.et_name);
          ed_phone=(EditText)view.findViewById(R.id.et_phone);
          ed_email=(EditText)view.findViewById(R.id.et_email);
          ed_address=(EditText)view.findViewById(R.id.et_address);
          edDialog=new AlertDialog.Builder(this).setView(view).setIcon(android.R.drawable.ic_input_add).setTitle("请选择你要编辑的选项").
                  setPositiveButton("确认", new OnClickListener()
                {
                    
                    @Override
                    public void onClick(DialogInterface arg0, int arg1)
                    {
                        if (flag)
                            {
                                insertData();  //执行插入操作
                            }else {
                                updateData();  //执行编辑或者修改操作
                            }
                        
                    }
                }).setNegativeButton("取消", new OnClickListener()
                {
                    
                    @Override
                    public void onClick(DialogInterface arg0, int arg1)
                    {
                        // TODO Auto-generated method stub
                        
                    }
                }).create();
          //初始化删除对话框
          delDialog=new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_input_add).setTitle("你确定要删除吗").
                  setPositiveButton("确认", new OnClickListener()
                  {
                      
                      @Override
                      public void onClick(DialogInterface arg0, int arg1)
                      {

                            int n= resolver.delete(ContactsContract.RawContacts.CONTENT_URI, "_id=?", new String[]{dataList.get(position).get("_id").toString()});
                            if (n>0)
                                {
                                    Toast.makeText(getApplicationContext(), "删除成功", 1).show();
                                    queryContacts(null);
                                }
                          
                      }
                  }).setNegativeButton("取消", new OnClickListener()
                  {
                      
                      @Override
                      public void onClick(DialogInterface arg0, int arg1)
                      {
                    
                      }
                  }).create();
          
        
      }
      //为ListView的长按操作设置菜单选项
        public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo)
        {
            // TODO Auto-generated method stub
            super.onCreateContextMenu(menu, v, menuInfo);
            getMenuInflater().inflate(R.menu.main,menu);//得到菜单视图
            position=((AdapterContextMenuInfo)menuInfo).position;  //获得选中的ListVIew的Id
        }
     
        public boolean onContextItemSelected(MenuItem item)
        {
            switch (item.getItemId())
                {
                case R.id.update://执行修改操作
                    flag=false;  //改变标志位
                    Map<String, Object>map=dataList.get(position);
                    //得到选中的ListVIew的值 并且显示到编辑框
                    ed_address.setText(map.get("address").toString());
                    ed_email.setText(map.get("email").toString());
                    ed_name.setText(map.get("display_name").toString());
                    ed_phone.setText(map.get("phone").toString());
                    edDialog.show();
                    break;
                case R.id.delete:
                    delDialog.show();
                    break;
                default:
                    break;
                }
            return super.onContextItemSelected(item);
        }
        //插入操作
      public void insertData()
      {
          String name=ed_name.getText().toString();
          String phone=ed_phone.getText().toString();
          String email=ed_email.getText().toString();
          String address=ed_address.getText().toString();
          ContentValues values=new ContentValues();
          values.put("display_name", name);
          values.put("display_name_alt", name);
          //向 raw_contacts表中插入数据。获得新增行的_id;
          Uri uri=resolver.insert(Uri.parse("content://com.android.contacts/raw_contacts"), values);
           //获得_id
          long id=ContentUris.parseId(uri);
          //向表中插入数据display_name
          // values.clear();
           values.put("data1", name);
           values.put("data2", name);
           values.put("raw_contact_id", id);
           values.put("mimetype", "vnd.android.cursor.item/name");
           resolver.insert(ContactsContract.Data.CONTENT_URI, values);
           //插入phone
          // values.clear();
           values.put("data1", phone);
           values.put("raw_contact_id", id);
           values.put("mimetype", "vnd.android.cursor.item/phone_v2");
           resolver.insert(ContactsContract.Data.CONTENT_URI, values);
           //插入email
           values.clear();
           values.put("data1",email);
           values.put("raw_contact_id", id);
           values.put("mimetype", "vnd.android.cursor.item/email_v2");
           resolver.insert(ContactsContract.Data.CONTENT_URI, values);
           //插入Address
            values.clear();
            values.put("data1", address);
            values.put("raw_contact_id", id);
            values.put("mimetype", "vnd.android.cursor.item/postal-address_v2");
            resolver.insert(ContactsContract.Data.CONTENT_URI, values);
            queryContacts(null);
      }
      public void updateData()
      {
          //获得对话框填写的内容
          String name=ed_name.getText().toString();
          String phone=ed_phone.getText().toString();
          String email=ed_email.getText().toString();
          String address=ed_address.getText().toString();
          //获得ListVIew Position位置上所对应的在data中的_id
          String _id=dataList.get(position).get("_id").toString();
          //根据_id修改raw_contacts
        ContentValues values=new ContentValues();
        values.put("display_name", name);
        values.put("display_name_alt", name);//x修改两次的原因是name在两个表中都存在
        resolver.update(Uri.parse("content://com.android.contacts/raw_contacts"), values, "_id=?", new String []{_id});
        //根据_id修改联系人姓名
        values.clear();
        values.put("data1", name);
        values.put("data2", name);
        int  n1=resolver.update(Uri.parse("content://com.android.contacts/data"), values, "raw_contact_id=? and mimetype_id=?", new String[]{_id,7+""});
       //根据_id修改联系人的phone
        values.clear();
        values.put("data1", phone);
        int n2=resolver.update( ContactsContract.Data.CONTENT_URI,values, "raw_contact_id=? and mimetype_id=?", new String []{_id,5+""});
      //根据id修改联系人的email
        values.clear();
        values.put("data1", email);
        int n3=resolver.update(ContactsContract.Data.CONTENT_URI, values, "raw_contact_id=? and mimetype_id=?", new String []{_id,1+""});
        //根据_id修改联系人的address;
        values.clear();
        values.put("data1", address);
        int n4=resolver.update(ContactsContract.Data.CONTENT_URI, values, "raw_contact_id=? and mimetype_id=?", new String []{_id,8+""});
        if (n1>0|n2>0|n3>0|n4>0)
            {
                Toast.makeText(this, "修改成功", 1).show();
                queryContacts(null);
            }
        else {
            Toast.makeText(this, "修改失败", 1).show();
        }
      
      }
}
··········································································································
接下来的是布局文件 ,写的比较简单,也不美观。这种细致的工作有空自己慢慢玩。
这个布局是用来查询和新增联系人。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn_query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="queryContacts"
        android:text="查询联系人" />
    <Button 
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/btn_query"
        android:onClick="addContacts"
        android:text="新增联系人"
        />
    <ListView 
        android:id="@+id/lv_showContacts"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/btn_query"></ListView>

</RelativeLayout>
-------------------------------------------------------------------------------------------------------联系人的修改和新增界面
 
  

 

 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn_query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="queryContacts"
        android:text="查询联系人" />
    <Button 
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/btn_query"
        android:onClick="addContacts"
        android:text="新增联系人"
        />
    <ListView 
        android:id="@+id/lv_showContacts"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/btn_query"></ListView>

</RelativeLayout>

---------------------------------------------------------------------------------------------------------------------

这是联系人的查询显示界面。。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <TextView 
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="name"/>
    <TextView 
        android:id="@+id/tv_phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="phone"/>
    <TextView 
        android:id="@+id/tv_address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_name"
        android:text="address"/>
    <TextView 
        android:id="@+id/tv_email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_name"
        android:layout_alignParentRight="true"
        android:text="email"/>
</RelativeLayout>

。还有一点,要对手机里的联系人进行操作,必须要在清单文件中加入两个权限。

<uses-permission android:name="android.permission.READ_CONTACTS"/>
   
        <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

 
 

 

转载于:https://www.cnblogs.com/V1ncent/p/4856225.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
*:手机通讯录联系人分类: 亲人 同事 朋友 其他 *:手机通讯录里面所有的联系人底层都装进一个集合对象里面 -》 ArrayList *:亲人 同事 朋友 其他类型里面所有的属性: char szm;->首字母 String name->联系人名字 int age->联系人年龄 char gender->联系人性别 long phone->手机号码 String zuoJi->座机号码 -》类似: 0531-6661760 *:创建联系人对象的时候: szm name age gender phone是必填内容 zuoJi可填可不填 *:如果创建联系人对象的时候 用户如果没有提供zuoJi属性值 那么将zuoJi变量赋值为"无座机号码" *:如果创建联系人对象的时候 用户如果提供zuoJi属性值了 那么直接将zuoJi变量赋值为用户输入的值 *:所有类里面的属性要求封装 //一个模块一个模块写 写完测试 测试通过写下一个模块 刚进入cmd里面的主界面 -》 6个小模块 A:显示所有联系人 B:查找某一位联系人 C:添加联系人 D:删除联系人 E:修改联系人 F:结束当前所有操作 显示所有联系人 如果用户选择是A 那么有两种选择: 输入校验: 用户可能输进去的不是a/b 要求重新输入 所有的输入都需要进行校验 a:按照首字母进行显示分类: [效果如下:] A 阿磊 1555950427 W 王刚美 18322009876 X 小明 18756789000 Z 张三 15555555555 周凯 18765432189 .... b:按照类别进行分类显示: [效果如下:] 朋友 张三 15555555555 小明 18756789000 周树人 17499990427 张三 15555445555 亲人 王刚美 18322009876 周凯 18765432189 同事 阿磊 1555950427 ... 查找某一位联系人 如果用户选择的是B: cmd面板显示下面这句话: 请问你是通过联系人名字进行精确查找/手机号码模糊查询 这里用户有两种选择: 用户可以直接的输入要查找联系人的名字 如果集合里面没有该用户 直接显示: 不好意思 当前用户不存在 如果集合里面有该用户 需要将用户的基本信息进行展示: [效果如下:] [输入]张三 [显示] 用户的基本信息: 联系人姓名:张三 联系人电话:15555555555 联系人座机号码:0531-6661760 用户的基本信息: 联系人姓名:张三 联系人电话:15555445555 联系人座机号码:无座机号码 用户还可以直接输入一段电话号码-》出现几个数字就可以 如果集合里面没有用户的号码出现这几个数字的 直接显示: 不好意思 当前用户不存在 如果查找到有这个用户存在 显示下面: [效果如下:] [输入]555555 [显示] 用户的基本信息: 联系人姓名:张三 联系人电话:15555555555 联系人座机号码:0531-6661760 添加联系人 如果用户选择的是C: 需要进行输入校验: 1:输入的大写首字母可能不是大写首字母 是数字 是其他的汉字 2:性别选择的不是A/B 3:注册用户名字的时候 应国家要求 关键字需要屏蔽(...) 4: 输入电话号码的时候 非11为数字 不是数字 不是以138 130 137 158 155 188. .开头 5:输入的年龄非数字 6:选择的分类可能不是亲人 朋友 同事 其他 7:座机可能不是按照 区号-号码的形式传进去的 座机号码的区号只能出现0564 0531 0532 cmd里面直接出现下面的内容: 请选择联系人的分类A:亲人 B:同事 C:朋友 D:其他 请输入联系人名字大写首字母: 请输入联系人的姓名: 请输入联系人的年龄: 请选择联系人性别:A:男 B:女 请输入联系人的电话: 请输入联系人座机号码(没有请回复N):N/区号-座机号 当用户依次输入所有的信息之后 产生一个联系人 但是需要判断集合里面是否已经存在该用户 如果存在(只要手机号码相同就认为是同一个联系人) 这个联系人存在不能继续添加进通讯录里面 cmd里面显示:对不起 当前用户已经存在 同一个用户不能添加多次 如果不存在 将当前联系人添加进集合里面 cmd里面显示:添加成功 删除联系人 如果用户选择的是D: 直接在cmd里面先以表的形式将所有联系人的信息显示出来: [效果如下:] 编号 姓名 年龄 电话 0 张三 22 155****5555 1 小明 18 187****9000 2 王刚美 28 183****9876 3 阿磊 24 155****4278 4 周凯 38 187****2189 5 周树人 99 174****0427 6 张三 22 155****5555 cmd里面显示:请问你要删除联系人的编号: 输入校验: 需要对当前输入的编码进行判断 是不是数字 如果不是 需要重新输入(从新输进去的内容还是需要进行输入校验) 如果集合里面有该编码对象的元素 从集合里面将当前编号的联系人删除 并在cmd里面显示删除成功 如果集合里面没有该编号对应的联系人 cmd里面显示:对不起 没有该编码对应的联系人 修改联系人 如果用户选择的是E: 输入校验: 修改之后的姓名还是不能出现关键字 修改之后的电话号码还是只能以155 159...开头 修改后的大写首字母还是要判断是否合法 可能用户不是按照格式正确输入 XXX-XXX-XXX(无论是修改前的输入还是修改后的输入格式需要正确) [效果如下] 请输入你要修改联系人的姓名大写首字母 姓名 联系电话(中间-隔开):Z-张三-15555555555 请输入修改后的联系人的姓名大写首字母 姓名 联系电话(中间-隔开):L-李四-18900000000 找到集合里面对应的联系人将信息修改掉 修改完毕 显示修改成功 如果集合里面没有找到叫张三的联系人 显示修改失败 没有查找到该联系人 结束当前所有操作 如果用户选择的是F: 直接结束当前所有的操作 -》 break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值