編輯:關於Android編程
Android提供了Contacts應用程序來管理聯系人,而且Android系統還為聯系人管理提供了ContentProvider,這就允許其它應用程序以ContentResolver來管理聯系人數據。
關於ContentProvider、ContentResolver和Uri詳解大家可以參考http://blog.csdn.net/fengyuzhengfan/article/details/37743963,這裡就不在過多的陳述了!
先送上實例運行效果圖:


在對聯系人進行操作之前,先讓我們了解一下通訊錄數據庫裡面主要的幾張表:
1) RawContacts:存放聯系人的ID,_id屬性為主鍵,聲明為autoincrement,即不需要手動設置,其他屬性也不需要手動設置就有默認值;
2) mimetypes:存放數據的類型,比如"vnd.android.cursor.item/name"表示“姓名”類型的數據,"vnd.android.cursor.item/phone_v2"表示“電話”類型的數據;
字段名
說明
電話
vnd.android.cursor.item/phone_v2
姓名
vnd.android.cursor.item/name
郵件
vnd.android.cursor.item/email_v2
通信地址
vnd.android.cursor.item/postal-address_v2
組織
vnd.android.cursor.item/organization
照片
vnd.android.cursor.item/photo
3) data 存放具體的數據。
字段名
說明
Data._ID
"_id"
Data.DISPLAY_NAME
“display_name”
Data.DATA1
“data1”
Data.DATA2
“data2”
Data.RAW_CONTACT_ID
“raw_contact_id”
Data.MIMETYPE
“mimetype”
4) raw_contact_id屬性用來連接raw_contacts表,每條記錄表示一個具體數據;我們主要的數據(email、phone等)都存放在data表;
5) StructuredName 中主要保存的是聯系人姓名,其稱呼名和其拼音名。
當我們向通信錄數據庫中插入聯系人的時候,一般是先往RawContacts表插入一行空值以獲得返回的rawContactId也就是聯系人ID,之後再根據這個ID陸續向Data表中插入聯系人的姓名、電話、以及Email等信息。
應用實例:
package com.jph.contactproviderdemo;
import java.util.ArrayList;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts.Data;
import android.provider.ContactsContract.RawContacts;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;
/**
* Describe:
* 通過ContenPprovider管理的聯系人
* 本實例主要實現了聯系人的添加與查詢
* @author JPH
* Date:2014.07.15
* */
public class ContactProviderDemo extends Activity {
ContentResolver resolver;
Button btnSelect,btnAdd;
EditText edtName,edtPhone,edtEmail;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnAdd=(Button)findViewById(R.id.add);
btnSelect=(Button)findViewById(R.id.search);
edtEmail=(EditText)findViewById(R.id.email);
edtName=(EditText)findViewById(R.id.name);
edtPhone=(EditText)findViewById(R.id.phone);
//獲取ContentResolver對象
resolver=getContentResolver();
/*******************************************查詢聯系人***************************************************/
btnSelect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//定義兩個ArrayList用於存放聯系人的信息
final ArrayListusername=new ArrayList();
final ArrayList>details=new ArrayList>();
//查詢聯系人數據
Cursor cursor=resolver.query(ContactsContract.Contacts.CONTENT_URI
, null, null, null, null);
//遍歷cursor取出聯系人姓名及ID
while (cursor.moveToNext()) {
//獲取聯系人姓名
String name=cursor.getString(cursor.getColumnIndex
(ContactsContract.Contacts.DISPLAY_NAME));
//獲取聯系ID
String contactId=cursor.getString(cursor.getColumnIndex
(ContactsContract.Contacts._ID));
username.add(name);
//查詢聯系人電話號碼
Cursor phones=resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null);
//定義一個detail列表數組用於存放聯系人的電話號碼和Email
ArrayListdetail=new ArrayList();
//遍歷查詢結果,獲取該聯系人的多個電話號碼
while (phones.moveToNext()) {
String phonenumber=phones.getString(phones.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
detail.add("電話號碼:"+phonenumber);
}
phones.close();//關閉phones游標回收資源
//查詢聯系人Email
Cursor emails=resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI
, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID+"="+contactId, null, null);
//遍歷查詢結果,獲取該聯系人的多個電話號碼
while (emails.moveToNext()) {
String emailAddress=emails.getString(emails.getColumnIndex(
ContactsContract.CommonDataKinds.Email.DATA));
detail.add("Email:"+emailAddress);
}
emails.close();//關閉emails游標回收資源
details.add(detail);
}
cursor.close();
//加載result.xml布局界面代表的視圖
View view=getLayoutInflater().inflate(R.layout.result, null);
//獲取view中的ExpandableListView組件
ExpandableListView list=(ExpandableListView) view.findViewById(R.id.list);
//創建ExpandableListAdapter為list填充數據
ExpandableListAdapter adapter=new BaseExpandableListAdapter() {
//定義一個顯示聯系人信息的TextView
TextView geTextView(){
TextView textView=new TextView(ContactProviderDemo.this);
AbsListView.LayoutParams lp=new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,64);
textView.setLayoutParams(lp);
textView.setPadding(36, 0, 0, 0);
textView.setTextSize(20);
return textView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView textView=geTextView();
textView.setText(getGroup(groupPosition).toString());
return textView;
}
@Override
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return groupPosition;
}
@Override
public int getGroupCount() {
// TODO Auto-generated method stub
return username.size();
}
@Override
public Object getGroup(int groupPosition) {
// TODO Auto-generated method stub
return username.get(groupPosition);
}
@Override
public int getChildrenCount(int groupPosition) {
// TODO Auto-generated method stub
return details.get(groupPosition).size();
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView textView=geTextView();
textView.setText(getChild(groupPosition, childPosition).toString());
return textView;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return childPosition;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return details.get(groupPosition).get(childPosition);
}
};
//為ExpandableListView設置ExpandableListAdapter
list.setAdapter(adapter);
//創建對話框顯示查詢結果
new AlertDialog.Builder(ContactProviderDemo.this).
setView(view).setPositiveButton("確定", null).show();
}
});
/*******************************************添加聯系人***************************************************/
btnAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//獲取用戶輸入的聯系人信息
String name=edtName.getText().toString();
String phone=edtPhone.getText().toString();
String email=edtEmail.getText().toString();
//定義一個ContentValues
ContentValues values=new ContentValues();
//向RawContacts.CONTENT_URI插入空值以獲得返回的rawContactId
Uri uri=resolver.insert(RawContacts.CONTENT_URI, values);
//解析出rawContactId
long rawContactId=ContentUris.parseId(uri);
values.clear();
/**********添加聯系人的姓名*************/
//設置聯系人Id
values.put(Data.RAW_CONTACT_ID, rawContactId);
//設置內容類型
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
//設置聯系人姓名(StructuredName中保存的是聯系人姓名,其稱呼名和其拼音名)
values.put(StructuredName.DISPLAY_NAME, name);
//向聯系人URi添加聯系人姓名
resolver.insert(ContactsContract.Data.CONTENT_URI, values);
values.clear();
/**********添加聯系人電話號碼*************/
values.put(Data.RAW_CONTACT_ID, rawContactId);
//設置內容類型
values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
//設置聯系人電話
values.put(Phone.NUMBER, phone);
//設置聯系人電話類型
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
//向聯系人URi添加電話號碼
resolver.insert(ContactsContract.Data.CONTENT_URI, values);
values.clear();
/**********添加聯系人Email*************/
//設置聯系人Id
values.put(Data.RAW_CONTACT_ID, rawContactId);
//設置內容類型
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
//設置聯系人Email
values.put(Email.DATA,email);
//向聯系人URi添加聯系人姓名
resolver.insert(ContactsContract.Data.CONTENT_URI, values);
Toast.makeText(ContactProviderDemo.this, "添加聯系人成功", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.contact_provider_demo, menu);
return true;
}
}
Android開發之接收系統廣播消息
BroadcastReceiver除了接收用戶所發送的廣播消息之外,還有一個重要的用途:接收系統廣播。如果應用需要在系統特定時刻執行某些操作,就
Android 基於百度語音的語音交互功能(推薦)
項目裡面用到了語音喚醒功能,前面一直在用訊飛的語音識別,本來打算也是直接用訊飛的語音喚醒,但是訊飛的語音喚醒要收費,試用版只有35天有效期。只好改用百度語音,百度語音所有
Android外部庫引用
庫項目的結構一個庫項目是一個包含了源碼和資源的項目,它可以被其他的項目引用,從而讓其他項目使用它包含的代碼和資源。多個Android應用程序項目可以引用同一個庫項目,同一
Android開發:LocationManager獲取經緯度及定位過程(附demo)
在Android開發當中,經常需要用到定位功能,尤其是依賴於地理位置功能的應用,很多人喜歡使用百度地圖,高德地圖提供的sdk,開放API,但是在僅僅需要經緯度,或者城市,