android:获取手机号码和姓名实现通讯录

NatRudduck 8年前

来自: http://blog.csdn.net/su20145104009/article/details/50826844


首先是运行结果

由于通讯录在手机里是以数据库贮存的 所以我们可以通过一个方法

context.getContentResolver().query(Phone.CONTENT_URI,      null, null, null, null);

来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息

当然读取手机通讯录需要权限 在adnroidManifest文件中声明即可

由于我也实现了打电话的功能 所以也要声明权限

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

布局文件

activity_main.xml

<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" >        <ListView          android:id="@+id/listView1"          android:layout_width="match_parent"          android:layout_height="wrap_content" >      </ListView>    </RelativeLayout>

listview的布局文件:item.xml,在这里我设置的头像为默认的 当然也可以在手机数据库中读取联系人的icon

<?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" >        <ImageView          android:id="@+id/image"          android:layout_width="60dp"          android:layout_height="60dp"          android:padding="10dp"          android:src="@drawable/ic_launcher" />        <TextView          android:id="@+id/name"          android:paddingTop="10dp"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:layout_toRightOf="@id/image"          android:text="name" />        <TextView          android:id="@+id/number"          android:paddingTop="5dp"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:layout_below="@id/name"          android:layout_toRightOf="@id/image"          android:text="number" />    </RelativeLayout>

自己封装一个联系人信息的类 有两个变量

package com.example.getphonenumber;    public class PhoneInfo {   private String name;   private String number;   public PhoneInfo(String name, String number) {    this.name = name;    this.number = number;   }   public String getName() {    return name;   }   public String getNumber() {    return number;   }  }


读取手机数据库中的通讯录

GetPhoneNumberFromMobile.class

package com.example.getphonenumber;    import java.util.ArrayList;  import java.util.List;    import android.content.Context;  import android.database.Cursor;  import android.provider.ContactsContract.CommonDataKinds.Phone;    public class GetPhoneNumberFromMobile {   private List<PhoneInfo> list;     public List<PhoneInfo> getPhoneNumberFromMobile(Context context) {    // TODO Auto-generated constructor stub    list = new ArrayList<PhoneInfo>();    Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI,      null, null, null, null);    //moveToNext方法返回的是一个boolean类型的数据     while (cursor.moveToNext()) {     //读取通讯录的姓名     String name = cursor.getString(cursor       .getColumnIndex(Phone.DISPLAY_NAME));     //读取通讯录的号码     String number = cursor.getString(cursor       .getColumnIndex(Phone.NUMBER));     PhoneInfo phoneInfo = new PhoneInfo(name, number);     list.add(phoneInfo);    }    return list;   }  }

自定义adapter

package com.example.getphonenumber;    import java.util.ArrayList;  import java.util.List;    import android.content.Context;  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{   private List<PhoneInfo> list;   private Context context;      public MyAdapter(List<PhoneInfo> list, Context context) {    this.list = list;    this.context = context;   }     @Override   public int getCount() {    // TODO Auto-generated method stub    return list.size();   }     @Override   public Object getItem(int position) {    // TODO Auto-generated method stub    return list.get(position);   }     @Override   public long getItemId(int position) {    // TODO Auto-generated method stub    return position;   }     @Override   public View getView(int position, View convertView, ViewGroup parent) {    // TODO Auto-generated method stub    if(convertView==null){     ViewHolder viewHolder=new ViewHolder();     LayoutInflater inflater=LayoutInflater.from(context);     convertView=inflater.inflate(R.layout.item, null);     viewHolder.name=(TextView) convertView.findViewById(R.id.name);     viewHolder.number=(TextView) convertView.findViewById(R.id.number);     viewHolder.name.setText(list.get(position).getName());     viewHolder.number.setText(list.get(position).getNumber());    }    return convertView;   }   public class ViewHolder{    TextView name;    TextView number;   }  }

MainActivity中listview加载适配器 并为其添加点击监听事件

package com.example.getphonenumber;    import java.util.ArrayList;  import java.util.List;    import android.net.Uri;  import android.os.Bundle;  import android.app.Activity;  import android.content.Intent;  import android.view.Menu;  import android.view.View;  import android.widget.AdapterView;  import android.widget.AdapterView.OnItemClickListener;  import android.widget.ListView;  import android.widget.Toast;    public class MainActivity extends Activity implements OnItemClickListener {   private ListView lv;   private MyAdapter adapter;   private GetPhoneNumberFromMobile getPhoneNumberFromMobile;   private List<PhoneInfo> list = new ArrayList<PhoneInfo>();     protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    lv = (ListView) findViewById(R.id.listView1);    getPhoneNumberFromMobile = new GetPhoneNumberFromMobile();    list = getPhoneNumberFromMobile.getPhoneNumberFromMobile(this);    adapter = new MyAdapter(list, this);    lv.setAdapter(adapter);    lv.setOnItemClickListener(this);   }     @Override   public void onItemClick(AdapterView<?> parent, View view, int position,     long id) {    // TODO Auto-generated method stub    String number = list.get(position).getNumber();    Intent intent = new Intent();    intent.setAction("android.intent.action.CALL");    intent.addCategory(Intent.CATEGORY_DEFAULT);    intent.setData(Uri.parse("tel:"+number));    startActivity(intent);   }    }