ContactsContract中Contacts,RawContacts和Data关系图解及其实例代码

来源:互联网 发布:中学生学什么编程语言 编辑:程序博客网 时间:2024/06/16 08:15

(1)Contacts,RawContacts和Data三者之间的关系

Contacts,RawContacts和Data关系图大体如下所示:



(2)三个变量的解释


2.1 ContactsContract.Contacts

Constants for the contacts table, which contains a record per aggregate of raw contacts representing the same person. 

2.2 ContactsContract.RawContacts

Constants for the raw contacts table, which contains one row of contact information for each person in each synced account. 

2.3 ContactsContract.Data

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)实例代码

3.1 MainActivity     //主菜单Acivity,包括两个按钮:一个用于浏览手机所有联系人信息,另外一个用于添加联系人。

package com.example.contactscontracttest;


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;
    }
    
}
对应的Layout文件activity_main.xml

<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>

对应的效果图:



(4)代码下载

编译环境 ADT android 4.4,代码请见我的百度云盘:
http://pan.baidu.com/s/1bndm2n1



0 0
原创粉丝点击