(1)Contacts,RawContacts和Data三者之间的关系
Contacts,RawContacts和Data关系图大体如下所示:
(2)三个变量的解释
2.1 ContactsContract.Contacts
Constants for the data table, which contains data points tied to a raw contact.
2.4 ContactsContract.CommonDataKinds
Container for definitions of common data types stored in the ContactsContract.Data table.
(3)实例代码
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
Button viewallcontacts;
Button addcontact;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewallcontacts = (Button)findViewById(R.id.viewallcontacts);
addcontact = (Button)findViewById(R.id.addcontact);
viewallcontacts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(MainActivity.this, ViewAllContactActivity.class);
startActivity(intent);
}
});
addcontact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(MainActivity.this, AddContactActivity.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
<LinearLayout 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"
android:orientation="vertical" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/viewallcontacts"
android:text="View all contacts"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addcontact"
android:text="Add contact"
/>
</LinearLayout>
效果图:
3.2 ViewAllContactActivity //显示手机里所有联系人的信息,由一个ExpandableListView和Button组成。ExpandableListView用于显示一个联系人名称和其所有的电话和Email的联系方式。按钮用于返回主菜单。
package com.example.contactscontracttest;
import java.util.ArrayList;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
public class ViewAllContactActivity extends Activity {
ExpandableListView list;
ArrayList<String> names = new ArrayList<String>();
ArrayList<String> phones = new ArrayList<String>();
ArrayList<String> ids = new ArrayList<String>();
ArrayList<String> emails = new ArrayList<String>();
ArrayList<ArrayList<String>> details = new ArrayList<ArrayList<String>>();
ContentResolver resolver;
Cursor cursor;
Button backtomainmenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.all_contacts);
resolver = getContentResolver();
//查询所有联系人对象
cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, new String[] {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME}, null, null, null);
while (cursor.moveToNext()) {
//获取联系人的唯一标示ID
long id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String strId = id + "";
ids.add(strId);
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
names.add(name);
ArrayList<String> detail = new ArrayList<String>();
//根据Id查询该联系人的一个或者多个电话
String[] projection = new String [] {
ContactsContract.CommonDataKinds.Phone.NUMBER
};
String selection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + "?";
String[] selectionArgs = new String [] {strId};
Cursor phoneCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, selection, selectionArgs, null);
while (phoneCursor.moveToNext()) {
String num = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
phones.add(num);
detail.add(num);
}
//根据Id查询该联系人的email邮箱
String [] proj = new String [] {
ContactsContract.CommonDataKinds.Email.ADDRESS
};
String sel = ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + "?";
String[] selArg = new String [] {strId};
Cursor emailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, proj, sel, selArg, null);
while (emailCursor.moveToNext()) {
String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
emails.add(email);
detail.add(email);
}
details.add(detail);
}
list = (ExpandableListView)findViewById(R.id.expandablelistview);
ExpandableListAdapter adapter = new BaseExpandableListAdapter() {
@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 = new TextView(ViewAllContactActivity.this);
textView.setText(names.get(groupPosition).toString());
LayoutParams lyParams = new LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT);
textView.setLayoutParams(lyParams);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(36, 0, 0, 0);
//textView.setTextSize(20);
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 names.size();
}
@Override
public Object getGroup(int groupPosition) {
// TODO Auto-generated method stub
return names.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 = new TextView(ViewAllContactActivity.this);
textView.setText(details.get(groupPosition).get(childPosition).toString());
LayoutParams lyParams = new LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT);
textView.setLayoutParams(lyParams);
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);
}
};
list.setAdapter(adapter);
backtomainmenu = (Button)findViewById(R.id.mainmenu);
backtomainmenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(ViewAllContactActivity.this, MainActivity.class);
startActivity(intent);
}
});
}
}
对应的Layout文件all_contacts.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/expandablelistview"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/mainmenu"
android:text="Go Mainmenu"
/>
</LinearLayout>
效果图如下:
3.3 AddContactActivity //添加联系人,由三个EditText和2个Button组成,三个文本框用于添加联系人名称,手机号和email地址,第一个按钮用于添加联系人信息,第二个按钮用于返回主菜单。
package com.example.contactscontracttest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class AddContactActivity extends Activity {
EditText addname;
EditText addphone;
EditText addemail;
Button addsubmit;
Button addgotomainmenu;
ContentResolver resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.add_contact);
resolver = getContentResolver();
addname = (EditText)findViewById(R.id.addname);
addphone = (EditText)findViewById(R.id.addphone);
addemail = (EditText)findViewById(R.id.addemail);
addsubmit = (Button)findViewById(R.id.addsubmit);
addgotomainmenu = (Button)findViewById(R.id.addgomainmenu);
//点击返回首页
addgotomainmenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(AddContactActivity.this, MainActivity.class);
startActivity(intent);
}
});
//添加通讯人
addsubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String strName = addname.getText().toString();
String strPhone = addphone.getText().toString();
String strEmail = addemail.getText().toString();
//先建立contact ID,再插入详细信息
ContentValues values = new ContentValues();
Uri newRawContactUri = resolver.insert(ContactsContract.RawContacts.CONTENT_URI, values);
long id = ContentUris.parseId(newRawContactUri);
//添加名称
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, id);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, strName);
resolver.insert(ContactsContract.Data.CONTENT_URI, values);
//添加手机号码
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, id);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, strPhone);
resolver.insert(ContactsContract.Data.CONTENT_URI, values);
//添加邮箱
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, id);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.Email.ADDRESS, strEmail);
resolver.insert(ContactsContract.Data.CONTENT_URI, values);
Toast.makeText(AddContactActivity.this, "添加新联系人成功", Toast.LENGTH_LONG).show();
}
});
}
}
对应的Layout文件add_contact.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addname"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id = "@+id/addphone"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addemail"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addsubmit"
android:text="Add"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addgomainmenu"
android:text="Back to Mainmenu"
/>
</LinearLayout>
对应的效果图: