獲取系統聯繫人信息,並顯示在ListView上

需求:把下列系統聯繫人的信息顯示在一個ListView上,當點擊listView子項時,把聯繫人的姓名和號碼返回到前一個activity,並顯示

121116696.png


效果圖

121839835.png


代碼實現


所需權限:android.permission.READ_CONTACTS

實體類Contact:

package cn.contactinfo;
public class Contact
{
    private String name;
    private String phone;
                                                                                                                                       
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getPhone()
    {
        return phone;
    }
    public void setPhone(String phone)
    {
        this.phone = phone;
    }
}

主activity 也就是第一個界面

package cn.contactinfo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ContactInfoActivity extends Activity
{
    private Button btn_take;
    private TextView tv_show;
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //找到相應的控件
        btn_take = (Button) findViewById(R.id.btn_take);
        tv_show=(TextView) findViewById(R.id.tv_show);
                                                                                                                     
        //爲button按鈕設置單擊事件
        btn_take.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v)
            {
                //實現activity的跳轉,並返回結果
                Intent intent = new Intent(ContactInfoActivity.this,SecondActivity.class);
                //設置結果碼爲0
                startActivityForResult(intent, 0);
                                                                                                                             
            }
        });
    }
    //返回結果必須要重寫onActivityResult()方法
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        //判斷data是否爲空
        if(data!=null)
        {
            //判斷結果碼是否爲0
            if (resultCode == 0)
            {
                //爲TextView設置文字
                tv_show.setText(data.getStringExtra("content"));
            }
        }
    }
}

ListView 界面

package cn.contactinfo;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
/**
 * 聯繫人列表activity
 * @author YSY
 */
public class SecondActivity extends Activity
{
    ListView lv_second;
    List<Contact> contacts;
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        //獲取聯繫人信息
        contacts = getContactInfo();
        //找到相應的控件
        lv_second=(ListView) findViewById(R.id.lv_second);
        //爲ListView設置適配器
        lv_second.setAdapter(new MyAdapter(this,contacts));
                                                                                                      
        //爲listView設置點擊事件,當點擊其某一子項時,需要把該子項的內容返回到上一個activity
        lv_second.setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                    long id)
            {
                //獲取子項上聯繫人對象
                Contact contact = (Contact) lv_second.getItemAtPosition(position);
                //獲取聯繫人的姓名和手機號
                String content ="姓名:"+contact.getName()+ "手機號:"+contact.getPhone();
                //創建Intent對象,來傳遞數據
                Intent intent = new Intent();
                intent.putExtra("content", content);
                //設置返回結果
                setResult(0,intent);
                //關閉當前的activity
                finish();
            }
        });
                                                                                                      
                                                                                                      
    }
    /**
     * 獲取系統聯繫人信息(核心內容)
     * @return Contact集合
     */
    public  List<Contact> getContactInfo()
    {
        //創建一個list集合,裏面的對象都是Contact
        List<Contact> contacts = new ArrayList<Contact>();
        //獲得一個ContentResolver的實例,可通過Activity的成員方法getContentResovler()方法,用於查詢數據用
        //ContentResolver參考網址http://blog.sina.com.cn/s/blog_8ce4eca801010qk5.html
        ContentResolver resolver  = getContentResolver();
        //創建兩個Uri對象
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri dataUri = Uri.parse("content://com.android.contacts/data");
        //調用ContentResolver對象的query方法,進行數據查詢 返回一個Cursor對象
        Cursor cursor = resolver.query(uri, null, null, null, null);
        //此處需要一個雙層循環,來實現查找聯繫人姓名和號碼
        //(外層循環)循環cursor 取出查找所用字段"_id"
        while(cursor.moveToNext())
        {
            int id = cursor.getInt(cursor.getColumnIndex("_id"));
            Cursor dataCursor = resolver.query(dataUri, null,  "raw_contact_id = ?", new String[]{String.valueOf(id)}, null);
            Contact contact = new Contact();
            //內存循環,循環data1和mimetype兩個字段內容
            while(dataCursor.moveToNext())
            {
                String data = dataCursor.getString(dataCursor.getColumnIndex("data1"));
                String mimetype = dataCursor.getString(dataCursor.getColumnIndex("mimetype"));
                                                                                                              
                //如果mimetype是手機號,就把data數據放到contant中
                if("vnd.android.cursor.item/phone_v2".equals(mimetype))
                {
                    contact.setPhone(data);
                    //如果mimetype是姓名,就把data數據放到contant中
                }else if("vnd.android.cursor.item/name".equals(mimetype)){
                    contact.setName(data);
                }
            }
            //每循環一次就把一個contant(聯繫人)對象存放到contacts集合當中
            contacts.add(contact);
            //關閉dataCursor
            dataCursor.close();
        }
        //關閉cursor
        cursor.close();
        return contacts;
                                                                                                      
    }
    /**
     * 自定義adapter
     * @author YSY
     *
     */
    public class MyAdapter extends BaseAdapter
    {
        Context context;
        List<Contact> contacts;
        public MyAdapter(Context context,List<Contact> contacts)
        {
            this.contacts=contacts;
            this.context=context;
        }
                                                                                                      
        public int getCount()
        {
                                                                                                          
            return contacts.size();
        }
        public Object getItem(int position)
        {
                                                                                                          
            return contacts.get(position);
        }
        public long getItemId(int position)
        {
                                                                                                          
            return position;
        }
                                                                                                      
        public View getView(int position, View convertView, ViewGroup parent)
        {
            Holder holder = null;
            if(convertView==null)
            {
                holder = new Holder();
                convertView = View.inflate(SecondActivity.this, R.layout.item, null);
                holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
                holder.tv_phone = (TextView) convertView.findViewById(R.id.tv_phone);
                                                                                                              
                convertView.setTag(holder);
            }
            else
            {
                holder = (Holder)convertView.getTag();
            }
            holder.tv_name.setText(contacts.get(position).getName());
            holder.tv_phone.setText(contacts.get(position).getPhone());
                                                                                                          
            return convertView;
        }
                                                                                                      
        public class Holder
        {
            private TextView tv_name;
            private TextView tv_phone;
        }
    }
                                                                                                  
}

       如果親們對於ContentResolver還不是很理解的,可以參考網址http://blog.sina.com.cn/s/blog_8ce4eca801010qk5.html

        希望這個能幫助各位,來實現此功能。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章