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的分別,也好查詢一個聯絡人。