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
源码下载
apk程序下载
本文出自【吴孝城的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程序下载
相关文章推荐
- Android菜鸟进阶之路一-Android基础
- 深入理解Android View
- Android 第三方开源库收集整理(转)
- Android沉浸式状态栏实现
- Android TextWatcher使用详解
- Android Studio开发工具的设置
- Android LruCache 缓存 类 源码 注解 分析
- Android退出应用最优雅的方式
- android studio 开启genymotion 出现"failed to create framebuffer image"
- android 顶部状态栏遮盖
- Android开发之EditText属性详解
- <安卓那点事>简单短信发送器
- android自定义控件学习(一)单行横向标签并做溢出处理
- 解决支付宝WEB支付界面模块在Android上自动滑动到登录模块的问题
- Android开发中使用软引用和弱引用
- Android缓存文件的存放
- Android如何实现音频输出切换
- Android linearlayout常用布局
- android intent flag的相关介绍
- android打印调用栈