您的位置:首页 > 移动开发 > Android开发

Android用ContentProvider开发通讯录

2016-01-15 14:26 513 查看
转载请标明出处:/article/8809965.html

本文出自【吴孝城的CSDN博客】


ContentProvider 内容提供者,是安卓的四大组件之一,

ContentProvider 为安卓的数据的存储和获取提供了统一的接口,在不同的应用程序之间共享数据,如联系人等

关于Content provider的详细内容看: Android之Content provider

ContentProvider 是以表的形式将数据组织起来

ContentProvider 提供的方法有

query:查询

insert:插入

update:更新

delete:删除

getType:得到数据类型

onCreate:创建数据时调用的回调函数

当外部应用要对ContentProvider数据进行操作时,可以使用ContentResolver来解析操作

插入数据到ContentProvider中

public Uri insert(Uri uri, ContentValues values)

删除ContentProvider中的数据

public int delete(Uri uri, String selection, String[] selectionArgs)

更新ContentProvider中的数据

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

从ContentProvider中获取数据可用

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

详细使用可看官方文档

https://developer.android.com/intl/zh-cn/reference/android/provider/ContactsContract.RawContacts.html

下面是用ContactsContract获取联系人的例子



要获取联系人,需要在AndroidManifest.xml中权限

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

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

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

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

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="cn.wuxiaocheng.contentprovider.MainActivity">

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<include layout="@layout/content_main" />

<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_input_add" />

</android.support.design.widget.CoordinatorLayout>
content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="cn.wuxiaocheng.contentprovider.MainActivity"
tools:showIn="@layout/activity_main">

<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
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="wrap_content"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="添加联系人"
android:textSize="26sp" />

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#22B8DD" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:"
android:textSize="20sp" />

<EditText
android:id="@+id/ed_Name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="1"
android:textSize="20sp" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="号码:"
android:textSize="20sp" />

<EditText
android:id="@+id/ed_Num"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:lines="1"
android:maxLength="11"
android:textSize="20sp" />
</LinearLayout>

</LinearLayout>
custom.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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:"
android:textSize="20sp" />

<EditText
android:id="@+id/ed_Name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="1"
android:textSize="20sp" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="号码:"
android:textSize="20sp" />

<EditText
android:id="@+id/ed_Num"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:lines="1"
android:maxLength="11"
android:textSize="20sp" />
</LinearLayout>

</LinearLayout>
item_list.xml

<?xml version="0.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
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/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="姓名"
android:textSize="18sp" />

<TextView
android:id="@+id/tvNum"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="00000000000"
android:textSize="16sp" />

</LinearLayout>
MainActivity.java

package cn.wuxiaocheng.contentprovider;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private MyAdapter myAdapter;
private List<ContactBean> contacts;
private FloatingActionButton fab;
private ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

lv = (ListView) findViewById(R.id.lv);
contacts = new ArrayList<ContactBean>();
myAdapter = new MyAdapter(this, contacts);
lv.setAdapter(myAdapter);

setContactsData();

add();

//点击
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ContactBean contact = myAdapter.getItem(position);
showCheckChoose(contact);
}
});
//长按
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
ContactBean contact = myAdapter.getItem(position);
deleteContact(contact);
return true;
}
});

}

private void deleteContact(final ContactBean contact) {
new AlertDialog.Builder(this)
.setTitle("删除该联系人")
.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ContactManager.deleteContact(MainActivity.this, contact);
setContactsData();
}
})
.setNegativeButton("取消", null)
.show();
}

private void showCheckChoose(final ContactBean contact) {
new AlertDialog.Builder(this)
.setItems(new String[]{"拨打电话", "发送短信", "修改联系人"},
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
Intent intentCall = new Intent();
intentCall.setAction(Intent.ACTION_CALL);
intentCall.setData(Uri.parse("tel:" + contact.getNum()));
startActivity(intentCall);
break;
case 1:
Intent intentSend = new Intent();
intentSend.setAction(Intent.ACTION_SENDTO);
intentSend.setData(Uri.parse("smsto:" + contact.getNum()));
startActivity(intentSend);
break;
case 2:
updateContact(contact);
setContactsData();
break;

default:
break;
}
}
})
.show();
}

//悬浮按钮
private void add() {
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addContext();
}
});
}

//添加联系人对话框
private void addContext() {
//拿到自定义布局
final LayoutInflater inflate = getLayoutInflater();
View layout = inflate.inflate(R.layout.add_contact, null);
final EditText ed_Name = (EditText) layout.findViewById(R.id.ed_Name);
final EditText ed_Num = (EditText) layout.findViewById(R.id.ed_Num);
AlertDialog dialog = new AlertDialog.Builder(this).create();
dialog.setView(layout);
//添加联系人
DialogInterface.OnClickListener ls = new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
ContactBean contact = new ContactBean();
contact.setName(ed_Name.getText().toString());
contact.setNum(ed_Num.getText().toString());
ContactManager.addContact(MainActivity.this, contact);
setContactsData();
}
};
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", ls);
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", cancel);
dialog.show();
}

//更新联系人对话框
private void updateContact(final ContactBean oldContact) {
View view = View.inflate(this, R.layout.custom, null);
final EditText ed_Name = (EditText) view.findViewById(R.id.ed_Name);
final EditText ed_Num = (EditText) view.findViewById(R.id.ed_Num);

ed_Name.setText(oldContact.getName());
ed_Num.setText(oldContact.getNum());

new AlertDialog.Builder(this)
.setTitle("修改联系人")
.setView(view)
.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ContactBean contact = new ContactBean();
contact.setRawContactId(oldContact.getRawContactId());
contact.setName(ed_Name.getText() + "");
contact.setNum(ed_Num.getText() + "");

ContactManager.updateContact(MainActivity.this, contact);
setContactsData();
}
})
.setNegativeButton("取消", null)
.show();
}

//加载联系人
private void setContactsData() {
List<ContactBean> contactData = ContactManager.getContacts(this);
contacts.clear();
contacts.addAll(contactData);
myAdapter.notifyDataSetChanged();
}

//取消动作
DialogInterface.OnClickListener cancel = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
};
}
ContactBean.java

package cn.wuxiaocheng.contentprovider;

/**
* Created by Administrator on 2016/1/12.
*/
public class ContactBean {
private String name;
private String num;
private long rawContactId;

public String getName() {
return name;
}

public void setName(String nama) {
this.name = nama;
}

public String getNum() {
return num;
}

public void setNum(String num) {
this.num = num;
}

public long getRawContactId() {
return rawContactId;
}

public void setRawContactId(long rawContactId) {
this.rawContactId = rawContactId;
}

@Override
public String toString() {
return "ContactBean{" +
"name='" + name + '\'' +
", num='" + num + '\'' +
", rawContactId=" + rawContactId +
'}';
}
}
ContactManager.java

package cn.wuxiaocheng.contentprovider;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;

import java.util.ArrayList;
import java.util.List;

public class ContactManager {
public static List<ContactBean> getContacts(Context context) {
List<ContactBean> contacts = new ArrayList<ContactBean>();
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(RawContacts.CONTENT_URI,
new String[]{RawContacts._ID},
null,
null,
null);
ContactBean contact;
while (cursor.moveToNext()) {
contact = new ContactBean();
long rawContactId = cursor.getLong(cursor.getColumnIndex(RawContacts._ID));
contact.setRawContactId(rawContactId);
Cursor dataCursor = resolver.query(Data.CONTENT_URI,
null,
Data.RAW_CONTACT_ID + "=?",
new String[]{String.valueOf(rawContactId)},
null);

while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(dataCursor.getColumnIndex(Data.DATA1));
String mimetype = dataCursor.getString(dataCursor.getColumnIndex(Data.MIMETYPE));

if (mimetype.equals(StructuredName.CONTENT_ITEM_TYPE)) {
contact.setName(data1);
} else if (mimetype.equals(Phone.CONTENT_ITEM_TYPE)) {
contact.setNum(data1);
}
}
contacts.add(contact);
dataCursor.close();
}
cursor.close();
return contacts;
}

public static void addContact(Context context, ContactBean contact) {
ContentResolver resolver = context.getContentResolver();

ContentValues values = new ContentValues();
Uri rawContactUri = resolver.insert(RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);

ContentValues valuesData1 = new ContentValues();
valuesData1.put(Data.RAW_CONTACT_ID, rawContactId);
valuesData1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
valuesData1.put(Phone.NUMBER, contact.getNum());
resolver.insert(Data.CONTENT_URI, valuesData1);

ContentValues valuesData2 = new ContentValues();
valuesData2.put(Data.RAW_CONTACT_ID, rawContactId);
valuesData2.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
valuesData2.put(StructuredName.DISPLAY_NAME, contact.getName());
resolver.insert(Data.CONTENT_URI, valuesData2);

}

public static void updateContact(Context context, ContactBean contact) {
ContentResolver resolver = context.getContentResolver();

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

ops.add(ContentProviderOperation
.newUpdate(Data.CONTENT_URI)
.withSelection(
Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?",
new String[]{
String.valueOf(contact.getRawContactId()),
StructuredName.CONTENT_ITEM_TYPE})
.withValue(StructuredName.DISPLAY_NAME, contact.getName())
.build());

ops.add(ContentProviderOperation
.newUpdate(Data.CONTENT_URI)
.withSelection(
Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?",
new String[]{
String.valueOf(contact.getRawContactId()),
Phone.CONTENT_ITEM_TYPE})
.withValue(Phone.NUMBER, contact.getNum()).build());
try {
resolver.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}

}

public static void deleteContact(Context context, ContactBean contact) {
ContentResolver resolver = context.getContentResolver();
resolver.delete(RawContacts.CONTENT_URI, RawContacts._ID + "=?",
new String[]{String.valueOf(contact.getRawContactId())});
}
}
MyAdapter.java

package cn.wuxiaocheng.contentprovider;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

public class MyAdapter extends BaseAdapter {
private Context context;
private List<ContactBean> contactBeen;

public MyAdapter(Context context, List<ContactBean> contactBeen) {
this.context = context;
this.contactBeen = contactBeen;
}

@Override
public int getCount() {
return contactBeen.size();
}

@Override
public ContactBean getItem(int position) {
return contactBeen.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null){
convertView = LayoutInflater.from(context).inflate(R.layout.item_list, parent,false);
viewHolder = new ViewHolder();
viewHolder.tvName = (TextView) convertView.findViewById(R.id.tvName);
viewHolder.tvNum = (TextView) convertView.findViewById(R.id.tvNum);
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvName.setText(contactBeen.get(position).getName());
viewHolder.tvNum.setText(contactBeen.get(position).getNum());
return convertView;
}

static class ViewHolder{
TextView tvName;
TextView tvNum;
}
}
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.wuxiaocheng.contentprovider">

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>



源码下载

apk程序下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: