Android 异步开发之 AsyncQueryHandler 批量添加联系人
AsyncQueryHandler:
官方解释是一个异步帮助类(A helper class to help make handling asynchronous ContentResolver queries easier.) 。这个类的主要作用就是异步对DB数据库进行操作,加快其数据处理的速度(这个非常重要,特别是大容量的数据处理时,例如几千联系人的数据读取,按正常的处理速度会非常的慢,使用AsyncQueryHandler,这就会大大的加快速度,增加用户的良好体验)。
AsyncQueryHandler重要的方法:
| final void |
startDelete(int token, Object cookie, Uri uri, String selection, String[] selectionArgs)
This method begins an asynchronous delete.
|
| final void |
startInsert(int token, Object cookie, Uri uri, ContentValues initialValues)
This method begins an asynchronous insert.
|
| void |
startQuery(int token, Object cookie, Uri uri, String[] projection, String selection, String[] selectionArgs, String orderBy)
This method begins an asynchronous query.
|
| final void |
startUpdate(int token, Object cookie, Uri uri, ContentValues values, String selection, String[] selectionArgs)
This method begins an asynchronous update.
|
显然,从方法的名字,我们可以看出,这是使用异步方式对DB数据库进行基本的增,删,改,查。
| void |
onDeleteComplete(int token, Object cookie, int result)
Called when an asynchronous delete is completed.
|
| void |
onInsertComplete(int token, Object cookie, Uri uri)
Called when an asynchronous insert is completed.
|
| void |
onQueryComplete(int token, Object cookie, Cursor cursor)
Called when an asynchronous query is completed.
|
| void |
onUpdateComplete(int token, Object cookie, int result)
Called when an asynchronous update is completed.
|
这几个方法,分别对应于上面四个异步操作时的回调方法。
AsyncQueryHandler的一个应用:读取电话联系人的数据信息
- public class TestAsyncQueryHandler extends Activity {
- private static final String NAME = "name", NUMBER = "number", SORT_KEY = "sort_key";
- private List<ContentValues> listData;
- private AsyncQueryHandler asyncQuery;
- private ListView personList;
- private BaseAdapter adapter;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- personList = (ListView) findViewById(R.id.list_view);
- asyncQuery = new MyAsyncQueryHandler(getContentResolver());
- //异步读取联系人的信息
- asyncQueryContact();
- }
- private void asyncQueryContact() {
- // TODO Auto-generated method stub
- Uri uri = Uri.parse("content://com.android.contacts/data/phones");
- String[] projection = { "_id", "display_name", "data1", "sort_key" };
- asyncQuery.startQuery(0, null, uri, projection, null, null,"sort_key COLLATE LOCALIZED asc");
- }
- private class MyAsyncQueryHandler extends AsyncQueryHandler {
- public MyAsyncQueryHandler(ContentResolver cr) {
- super(cr);
- }
- @Override
- protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
- if (cursor != null && cursor.getCount() > 0) {
- listData = new ArrayList<ContentValues>();
- //cursor.moveToFirst();
- for (int i = 0; i < cursor.getCount(); i++) {
- ContentValues cv = new ContentValues();
- cursor.moveToPosition(i);
- String name = cursor.getString(1);
- String number = cursor.getString(2);
- String sortKey = cursor.getString(3);
- if (number.startsWith("+86")) {
- cv.put(NAME, name);
- //process (+86)
- cv.put(NUMBER, number.substring(3));
- cv.put(SORT_KEY, sortKey);
- } else {
- cv.put(NAME, name);
- cv.put(NUMBER, number);
- cv.put(SORT_KEY, sortKey);
- }
- listData.add(cv);
- }
- if (listData.size() > 0) {
- setAdapter(listData);
- }
- cursor.close();
- }
- }
- }
- private void setAdapter(List<ContentValues> listData) {
- adapter = new ListAdapter(this, listData);
- personList.setAdapter(adapter);
- }
- private class ListAdapter extends BaseAdapter {
- private LayoutInflater inflater;
- private List<ContentValues> list;
- public ListAdapter(Context context, List<ContentValues> list) {
- this.inflater = LayoutInflater.from(context);
- this.list = list;
- }
- @Override
- public int getCount() {
- return list.size();
- }
- @Override
- public Object getItem(int position) {
- return list.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder;
- if (convertView == null) {
- convertView = inflater.inflate(R.layout.list_item, null);
- holder = new ViewHolder();
- holder.name = (TextView) convertView.findViewById(R.id.name);
- holder.number = (TextView) convertView.findViewById(R.id.number);
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
- ContentValues cv = list.get(position);
- holder.name.setText(cv.getAsString(NAME));
- holder.number.setText(cv.getAsString(NUMBER));
- return convertView;
- }
- private class ViewHolder {
- TextView name;
- TextView number;
- }
- }
- }
这个例子,只是使用了AsyncQueryHandler类中的异步查询方法,其它的方法,也是类似,大家可以自己尝试。
源代码下载地址:
http://download.csdn.net/detail/hfreeman2011/5040647
参考资料:
1.android异步的几种方式
http://ericchan2012.iteye.com/blog/1673929
2.官方文档
http://developer.android.com/reference/android/content/AsyncQueryHandler.html
3.android快速滑动列表 首字母提示
<!-- 添加联系人权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<!-- 加入SDCARD的删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 加入SDCARD的写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 联系人相关的uri -->
content://com.android.contacts/contacts 操作的数据是联系人信息Uri
content://com.android.contacts/data/phones 联系人电话Uri
content://com.android.contacts/data/emails 联系人Email Uri
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(getApplicationContext(), "没有sdcard",0).show();
return;
}
final String path = Environment.getExternalStorageDirectory()
.toString() + "/addcont/";
((TextView)findViewById(R.id.tv)).setText("文件存放的目录:"+path);
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File dirFire = new File(path);
if (!dirFire.exists()) {
dirFire.mkdirs();
return;
}
File[] files = dirFire.listFiles(new FileFilter() {
public boolean accept(File arg0) {
if (arg0.getName().endsWith(".txt")) {// 选择txt文件
return true;
}
return false;
}
});
if (files != null && files.length > 0) {
for (File file : files) {
try {
FileInputStream is = null; // 输入流读取文件
BufferedReader dr = null; // 读行
is = new FileInputStream(file);
dr = new BufferedReader(new InputStreamReader(is));
String totalTrans = null;
List<Tb_contacts> contacts = new ArrayList<Tb_contacts>();
while ((totalTrans = dr.readLine()) != null) {
if (totalTrans.contains("|")) {
String[] conStrings = totalTrans.trim().split("|");
contacts.add(new Tb_contacts(conStrings[1], conStrings[0]));
} else {
contacts.add(new Tb_contacts("", totalTrans.trim()));
}
}
BatchAddContact(contacts);
dr.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "导入联系人失败",0).show();
}
}
}
} else {
}
}
});
}
public void BatchAddContact(List<Tb_contacts> list) {
try {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = 0;
for (Tb_contacts contact : list) {
rawContactInsertIndex = ops.size(); // 有了它才能给真正的实现批量添加
ops.add(ContentProviderOperation
.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.withYieldAllowed(true).build());
// 添加姓名
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID,
rawContactInsertIndex)
.withValue(Data.MIMETYPE,
StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.DISPLAY_NAME,
contact.getName()).withYieldAllowed(true)
.build());
// 添加号码
ops.add(ContentProviderOperation
.newInsert(
android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID,
rawContactInsertIndex)
.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, contact.getNumber())
.withValue(Phone.TYPE, Phone.TYPE_MOBILE)
.withValue(Phone.LABEL, "").withYieldAllowed(true)
.build());
}
if (ops != null) {
// 真正添加
ContentProviderResult[] results = getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
Log.i("tag", "----------------------------------" + results);
for (ContentProviderResult result : results) {
}
}
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
}
private class Tb_contacts {
private String name;
private String number;
public Tb_contacts(String name, String number) {
super();
this.name = name;
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
}
[mw_shl_code=java,true]/**
* 添加联系人
*/
private void insertNewContact(ContactItemList contactItemList) {
for (int rawContactInsertIndex = 0; rawContactInsertIndex < contactItemList.size(); rawContactInsertIndex++) { ContactItem contactItem = contactItemList.get(rawContactInsertIndex);
String name = contactItem.getName();
String nickname = contactItem.getNickName();
String company = contactItem.getUnit();
String post = contactItem.getBusiness();
String mobilephone = contactItem.getCellPhone();
String hometel = contactItem.getHomeTel();
String officetel = contactItem.getOfficeTel();
String fax = contactItem.getFax();
String email = contactItem.getEmail();
String qq = contactItem.getQq();
String msn = contactItem.getMsn();
Date birthday = contactItem.getBirthday();
String remark = contactItem.getRemark(); ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); // 在名片表插入一个新名片
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(ContactsContract.RawContacts._ID, 0).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED).build()); // 姓名
if (StringUtils.isNotEmpty(name)) {
// System.out.println("name: " + name);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name).build());
} // 昵称
if (StringUtils.isNotEmpty(nickname)) {
// System.out.println("nickname: " + nickname);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE).withValue(Nickname.NAME, nickname).withValue(Nickname.TYPE, Nickname.TYPE_CUSTOM).build());
} // 公司
if (StringUtils.isNotEmpty(company)) {
// System.out.println("company: " + company);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, company).withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK).build());
} // 职位
if (StringUtils.isNotEmpty(post)) {
// System.out.println("post: " + post);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Organization.TITLE, post).withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK).build());
} // 手机
if (StringUtils.isNotEmpty(mobilephone)) {
// System.out.println("mobilephone: " + mobilephone);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, mobilephone).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_MOBILE).build());
} // 家庭电话
if (StringUtils.isNotEmpty(hometel)) {
// System.out.println("hometel: " + hometel);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, hometel).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_HOME).build());
} // 办公电话
if (StringUtils.isNotEmpty(officetel)) {
// System.out.println("officetel: " + officetel);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, officetel).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_WORK).build());
} // 传真
if (StringUtils.isNotEmpty(fax)) {
// System.out.println("fax: " + fax);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, fax).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_FAX_WORK).build());
} // 邮箱
if (StringUtils.isNotEmpty(email)) {
// System.out.println("email: " + email);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Email.DATA, email).withValue(ContactsContract.CommonDataKinds.Email.TYPE, Email.TYPE_WORK).build());
if (StringUtils.isNotEmpty(qq)) {
// System.out.println("qq: " + qq);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Im.DATA1, qq).withValue(ContactsContract.CommonDataKinds.Im.PROTOCOL, ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ).build());
} // MSN
if (StringUtils.isNotEmpty(msn)) {
// System.out.println("msn: " + msn);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Im.DATA1, msn).withValue(ContactsContract.CommonDataKinds.Im.PROTOCOL, ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN).build());
} // 备注
if (StringUtils.isNotEmpty(remark)) {
// System.out.println("remark: " + remark);
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Note.NOTE, remark).build());
} try {
ContentProviderResult[] result = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
for (ContentProviderResult cpr : result) {
System.out.println(cpr.uri.toString());
}
} catch (OperationApplicationException e) {
Log.e(TAG, e.getMessage(), e);
} catch (RemoteException e) {
Log.e(TAG, e.getMessage(), e);
}
} }[/mw_shl_code]
//自己解决了~ 把这一句里的
// 在名片表插入一个新名片 ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(ContactsContract.RawContacts._ID, 0).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED).build()); withValue(ContactsContract.RawContacts._ID, 0).去掉就可以了~
package com.ljq.contact; import java.util.ArrayList; import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.test.AndroidTestCase;
import android.util.Log; public class ContactTest extends AndroidTestCase{
private static final String TAG = "ContactTest"; /**
* 获取通讯录中联系人
*/
public void testGetContact(){
ContentResolver contentResolver = this.getContext().getContentResolver();
Uri uri = Uri.parse("content://com.android.contacts/contacts");
Cursor cursor = contentResolver.query(uri, null, null, null, null);
while(cursor.moveToNext()){
// 获取联系人姓名
StringBuilder sb = new StringBuilder();
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
sb.append("contactId=").append(contactId).append(",name=").append(name); //获取联系人手机号码
Cursor phones = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,
null, null);
while(phones.moveToNext()){
String phone = phones.getString(phones.getColumnIndex("data1"));
sb.append(",phone=").append(phone);
} //获取联系人email
Cursor emails = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,
null, null);
while(emails.moveToNext()){
String email = emails.getString(emails.getColumnIndex("data1"));
sb.append(",email=").append(email);
}
Log.i(TAG, sb.toString());
}
} /**
* 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
*
* 这是后面插入data表的数据,只有执行空值插入,才能使插入的联系人在通讯录里可见
*/
public void testInsert(){
ContentValues values = new ContentValues();
//首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
Uri rawContactUri = this.getContext().getContentResolver().insert(RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri); //往data表入姓名数据
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.GIVEN_NAME, "zhangsan");
this.getContext().getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values); //往data表入电话数据
values.clear();
values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, "5554");
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
this.getContext().getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values); //往data表入Email数据
values.clear();
values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
values.put(Email.DATA, "ljq218@126.com");
values.put(Email.TYPE, Email.TYPE_WORK);
this.getContext().getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);
} /**
* 批量添加联系人,处于同一个事务中
*/
public void testSave() throws Throwable{
//文档位置:reference\android\provider\ContactsContract.RawContacts.html
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = 0;
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.build()); //文档位置:reference\android\provider\ContactsContract.Data.html
ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.GIVEN_NAME, "lisi")
.build());
ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, "5556")
.withValue(Phone.TYPE, Phone.TYPE_MOBILE)
.withValue(Phone.LABEL, "")
.build());
ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
.withValue(Email.DATA, "lisi@126.cn")
.withValue(Email.TYPE, Email.TYPE_WORK)
.build()); ContentProviderResult[] results = this.getContext()
.getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
for (ContentProviderResult result : results) {
Log.i(TAG, result.uri.toString());
}
} }
Android 异步开发之 AsyncQueryHandler 批量添加联系人的更多相关文章
- Android混合开发之WebViewJavascriptBridge实现JS与java安全交互
前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...
- Android混合开发之WebView与Javascript交互
前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...
- Android混合开发之WebView使用总结
前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...
- Android安全开发之WebView中的地雷
Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...
- android软件开发之webView.addJavascriptInterface循环渐进【二】
本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...
- Android NDK开发之C调用Java及原生代码断点调试(二)
上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了.点击:Android NDK开发之从Java与 ...
- Android安全开发之ZIP文件目录遍历
1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接s ...
- Android驱动开发之Hello实例
Android驱动开发之Hello实例: 驱动部分 modified: kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconf ...
- android软件开发之webView.addJavascriptInterface循环渐进【一】
本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...
随机推荐
- Hibernate入门(三)—— 一对多、多对多关系
一.一对多关系 1.概念 一对多关系是关系型数据库中两个表之间的一种关系.通常在数据库层级中,两表之间是有主外键关系的.在ORM中,如何通过对象描述表之间的关系,是ORM核心. 2.Hiberna ...
- python单继沿用父类属性的两种方法
方法一 在子类中用父类调用其init方法(不建议) 方法二 在子类中使用super获得父类的方法 class Aaimal(object): type_name = '动物类' def __init_ ...
- 停课+2week
可真是,累啊. 本以为停课之后会轻松一点,结果天天好累的说... 今天开始得去锻炼锻炼了... 已经好几次突然一阵晕眩了qwq... 希望我还能挺得住吧,至少要挺到WC结束啊... 这次,可是关系到我 ...
- ThreeJS文字作为纹理贴图
文字作为纹理贴图 From:http://www.linhongxu.com/post/view?id=222 这里可以使用canvas作为纹理贴图,Three为我们提供里CanvasTexture ...
- [2014年学习计划之RoR系列] 第二步 – 熟悉Ruby语言 (2/n) Blocks and Iterators (代码块和迭代器)
[就算没有含金量,也请尊重原创, 转载自我的独立博客http://brucejia.net] Blocks and Iterators (代码块和迭代器) 代码块和迭代器是Ruby语言中比较有特点的东 ...
- redis使用方式
关于Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案 1.修改redis.conf配置文件,将绑定的ip地址 ...
- Windows下部署ElasticSearch5.0以下版本
Windows下部署ElasticSearch分ElasticSearch5.0以上版本(包括5.0)和ElasticSearch5.0以下版本两种情况,这两种安装方式有很大不同.今天首先说Elast ...
- Css3中拖拽效果的实例(带有注释~欢迎指教)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python函数汇总(陆续更新中...)
range的用法 函数原型:range(start, end, scan): 参数含义: start:计数从start开始.默认是从0开始.例如range(5)等价于range(0, 5); end: ...
- [翻译] ASCScreenBrightnessDetector
ASCScreenBrightnessDetector ASCScreenBrightnessDetector lets you easily detect screen brightness cha ...