1. 程式人生 > >Android-手機通訊錄相關

Android-手機通訊錄相關

獲取所有聯絡人的姓名、號碼

許可權

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

程式碼:

/**
 * android之獲取所有聯絡人的姓名、號碼
 */
public class ContactActivityI extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacti);

        String[] cols = {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, cols, null
, null, null); if (cursor != null) { int count = cursor.getCount(); for (int i = 0; i < count; i++) { cursor.moveToPosition(i); // 取得聯絡人名字 int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME); int
numberFieldColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); String name = cursor.getString(nameFieldColumnIndex); String number = cursor.getString(numberFieldColumnIndex); Log.e("111", "queryContactPhoneNumber: name=="
+ name + " number==" + number); } cursor.close(); } } }

選擇聯絡人並返回電話號碼

許可權:

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

程式碼:

/**
 * http://blog.csdn.net/jason0539/article/details/21855825
 * android之選擇聯絡人並返回電話號碼
 */
public class ContactActivity extends Activity {
    private TextView show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);

        Button pick = (Button) findViewById(R.id.pick);
        show = (TextView) findViewById(R.id.show);
        pick.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                ContactActivity.this.startActivityForResult(intent, 1);
            }
        });
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    Uri contactData = data.getData();
                    Cursor cursor = managedQuery(contactData, null, null, null, null);
                    cursor.moveToFirst();
                    String num = getContactPhone(cursor);

                    show.setText("所選手機號為:" + num);

                    //號碼會有空格,如259 9281 7922
                    Log.e("333", "num==" + num);
                    String trim = num.trim();
                    Log.e("333", "trim==" + trim);
                    String replace = trim.replace(" ", "");
                    Log.e("333", "replace==" + replace);
                }
                break;

            default:
                break;
        }
    }

    private String getContactPhone(Cursor cursor) {
        int phoneColumn = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
        int phoneNum = cursor.getInt(phoneColumn);

        String result = "";
        if (phoneNum > 0) {
            // 獲得聯絡人的ID號
            int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
            String contactId = cursor.getString(idColumn);

            // 獲得聯絡人電話的cursor
            Cursor phoneCursor = getContentResolver().query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
                            + contactId, null, null);
            if (phoneCursor != null && phoneCursor.moveToFirst()) {
                for (; !phoneCursor.isAfterLast(); phoneCursor.moveToNext()) {
                    int index = phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                    result = phoneCursor.getString(index);
                }
                if (!phoneCursor.isClosed()) {
                    phoneCursor.close();
                }
            }
        }
        return result;
    }

}

activity_contact.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">

    <TextView
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/pick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/show"
        android:layout_below="@+id/show"
        android:text="選擇聯絡人" />

</RelativeLayout>

撥打電話:

Intent intent = new Intent();  
intent.setAction(Intent.ACTION_CALL);//ACTION_DIAL  
intent.setData(Uri.parse("tel:"+"110"));  
startActivity(intent);  

許可權:

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

通訊錄相關知識:

Android聯絡人資料庫檔案(contact2.db):

比較重要的幾個表:


1、contacts表

_id :表的ID,主要用於其它表通過contacts 表中的ID可以查到相應的資料。 
display_name: 聯絡人名稱 
photo_id:頭像的ID,如果沒有設定聯絡人頭像,這個欄位就為空 
times_contacted:通話記錄的次數 
last_time_contacted: 最後的通話時間 
lookup :是一個持久化的儲存,因為使用者可能會改名,但是它改不了lookup 

該表儲存了本機儲存的所有聯絡人,每個聯絡人佔一行,該表儲存了聯絡人的ContactID、聯絡次數、最後一次聯絡的時間、是否含有號碼、是否被新增到收藏夾等資訊。

2、raw_contacts表

version :版本號,用於監聽變化 
deleted :刪除標誌, 0為預設 1 表示這行資料已經刪除 
display_name : 聯絡人名稱 
last_time_contacts : 最後聯絡的時間 

該表儲存了所有建立過的手機聯絡人,每個聯絡人佔一行,表裡有一列標識該聯絡人是否被刪除,該表儲存了兩個ID: RawContactID和ContactID,從而將contacts表和raw_contacts表聯絡起來。該表儲存了聯絡人的RawContactID、ContactID、聯絡次數、最後一次聯絡的時間、是否被新增到收藏夾、顯示的名字、用於排序的漢語拼音等資訊。

3、 mimetypes 表
該表定義了所有的MimeTypeID,即聯絡人的各個欄位的唯一標誌。

4、data表
該表儲存了所有建立過的手機測聯絡人的所有資訊,每個欄位佔一行 ,該表儲存了兩個ID: MimeTypeID和RawContactID,從而將data表和raw_contacts表聯絡起來。

聯絡人的所有資訊儲存在列data1至data15中,各列中儲存的內容根據MimeTypeID的不同而不同。如儲存號碼(MimeTypeID=5)的那行資料中,data1列儲存號碼,data2列儲存號碼型別(手機號碼/家庭號碼/工作號碼等)。

對聯絡人的基本操作(增刪改查)許可權設定:

 <!-- 讀聯絡人許可權 -->
 <uses-permission android:name="android.permission.READ_CONTACTS"/>
 <!-- 寫聯絡人許可權 -->
 <uses-permissionandroid:name="android.permission.WRITE_CONTACTS" />

其他:

contacts表也就是聯絡人表的URI

scontent://com.android.contacts/contact 

對應類靜態常量為

ContactsContract.Contacts.CONTENT_URI

聯絡人電話URI

content://com.android.contacts/data/phones 

對應靜態常量為

ContactsContract.CommonDataKinds.Phone.CONTENT_URI

聯絡人郵箱URI

content://com.android.contacts/data/emails  ,

對應靜態常量為

ContactsContract.CommonDataKinds.Email.CONTENT_URI

聯絡人地址URI

content://com.android.contacts/data/postals  ,

對應靜態常量為

ContactsContract.CommonDataKinds.StructuredPostall.CONTENT_URI

所有聯絡人的Uri

content://contacts/people

某個聯絡人x的Url

content://contacts/people/x

data表URI

content://com.Android.contacts/data

對應靜態常量為

ContactsContract.Data.CONTENT_URI

通過content://com.android.contacts/contacts ,你就可以查詢contacts表
其中比較重要的欄位有:
_id–>聯絡人的ID

通過content://com.android.contacts/data 你就可以查詢data表
row_contact_id–>聯絡人的id地址
data1–>所存在聯絡人的名字、郵箱和出生地
data2–>指明資料的型別(一個int型,相當於mineetypes的id)。eg vnd.android.cursor.item/email_v2
minetypes–>指明具體的資料的型別

當你不知道你表中有多少資料的時候,最好就是通過cursor.getColumnnames()來列印你所有的列,然後去資料庫中找尋相對應的值

而實際上,在你使用的過程中,你完全可以通過content://com.android.contacts/data來查詢到所有的資料,
但是那樣你就不好判斷id,所以才會引用contacts的URI,用於id的分別,也好查詢一個聯絡人。