实例教程十一:访问通信录中的联系人和添加联系人
Android《五子连珠》游戏完整源码分享
http://www.eoeandroid.com/thread-211877-1-1.html
android仿酷狗播放器
http://www.eoeandroid.com/thread-185894-1-1.html
自制K线图,新鲜出炉
http://www.eoeandroid.com/thread-182290-1-1.html
package cn.itcast.contacts; import java.util.ArrayList; import android.content.ContentProviderOperation; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.AndroidTestCase; import android.util.Log; public class ContactsTest extends AndroidTestCase{ private static final String TAG = "ContactsTest"; /** * 获取 所有联系人 * @throws Exception */ public void testContacts() throws Exception{ Uri uri = Uri.parse("content://com.android.contacts/contacts"); ContentResolver resolver = getContext().getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null); while(cursor.moveToNext()){ int contactId = cursor.getInt(0); StringBuilder sBuilder = new StringBuilder("contactId="); sBuilder.append(contactId); uri = Uri.parse("content://com.android.contacts/contacts" + contactId + "/data"); Cursor dataCursor = resolver.query(uri, new String[]{"mimetype", "data1", "data2"}, null, null, null); while(dataCursor.moveToNext()){ String data = dataCursor.getString(dataCursor.getColumnIndex("data1")); String type = dataCursor.getString(dataCursor.getColumnIndex("data2")); if("vnd.android.cursor.item/name".equals(type)){ //姓名 sBuilder.append(", name=" + data); }else if("vnd.android.cursor.item/email_v2".equals(type)){ //email sBuilder.append(", email=" + data); }else if("vnd.android.cursor.item/phone_v2".equals(type)){ //phone sBuilder.append(", phone=" + data); } } Log.i(TAG, sBuilder.toString()); } } /** * 根据号码获取联系人的姓名 * @throws Exception */ public void testContactNameByPhoneNumber() throws Exception{ String pNumber = "18012345678"; Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + pNumber); ContentResolver resolver = getContext().getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{"display_name"}, null, null, null); //为何使用moveToFirst()? //因为查找的数据只有一条,那一开始肯定就有一条 if(cursor.moveToFirst()){ String name = cursor.getString(0); Log.i(TAG, name); } cursor.close(); } /** * 添加联系人 * @throws Exception */ public void testAddContact() throws Exception{ Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = getContext().getContentResolver(); ContentValues values = new ContentValues(); long contactId = ContentUris.parseId(resolver.insert(uri, values)); //添加姓名 uri = Uri.parse("content://com.android.contacts/data"); values.put("raw_contact_id", contactId); values.put("mimetype", "vnd.android.cursor.item/name"); values.put("data2", "张小小"); resolver.insert(uri, values); //添加电话 values.clear(); values.put("raw_contact_id", contactId); values.put("mimetype", "vnd.android.cursor.item/phone_v2"); values.put("data2", "2"); values.put("data1", "13671325874"); resolver.insert(uri, values); //添加Email values.clear(); values.put("raw_contact_id", contactId); values.put("mimetype", "vnd.android.cursor.item/email_v2"); values.put("data2", "2"); values.put("data1", "123@qq.com"); resolver.insert(uri, values); } /** * 在同一事务中完成 联系人各项数据的添加 * @throws Exception */ public void testAddContact2() throws Exception{ Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = getContext().getContentResolver(); ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri) .withValue("account_name", null) .build(); operations.add(op1); uri = Uri.parse("content://com.android.contacts/data"); //添加姓名 //0--使用第一操作对象 添加完记录后所返回的ID ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/name") .withValue("data2", "张三") .build(); operations.add(op2); ContentProviderOperation op3 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/phone_v2") .withValue("data1", "13671325874") .withValue("data2", "2") .build(); operations.add(op3); ContentProviderOperation op4 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/email_v2") .withValue("data1", "123@qq.com") .withValue("data2", "2") .build(); operations.add(op4); resolver.applyBatch("com.android.contacts", operations); //applyBatch运行流程 //{ // begin(); // for(op: operations){ // op.app() // } // end(); //} } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.itcast.contacts" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="android.test.runner" /> </application> <instrumentation android:name="android.test.InstrumentationTestRunner" android:label="Tests for My App" android:targetPackage="cn.itcast.contacts" > </instrumentation> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> </manifest>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架