本文共 13769 字,大约阅读时间需要 45 分钟。
使用Contact数据来批量插入联系人主要需要contact数据模型的以下两文件:
contacts.model下的:
EntitySet.java
EntityDelta.java
以上文件的地址可以在找到。
EntitySet在Android 4.0中已经被改名为EntityDeltaList.
我自己的代码在MainActivity.java,DialogResolver.java和ContactPersistTask.java。
注意:需要在AndroidManifest.加入写contacts的权限。
写contacts的权限为:
<uses-permission android:name="android.permission.READ_CONTACTS" />
读contacts的权限为:
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
文件1MainActivity.java文件
package com.teleca.robin.Contact;
import android.app.Activity;
import android.app.Dialog;
import ntent.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public classMainActivityextends Activity implements DialogResolver{
final static String TAG="robin";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.Button01);
OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
doAddAction();
}
};
button.setOnClickListener(listener);
editText=(EditText)findViewById(R.id.editText);
editText.setText("100");
}
EditText editText;
void doAddAction() {
String content=editText.getText().toString();
int count=0;
try{
count=Integer.parseInt(content);
}catch(NumberFormatException e)
{
Toast.makeText(this, "please input a Number for Contacts count!",
Toast.LENGTH_SHORT).show();
}
final ContactPersistTask task = new ContactPersistTask(this);
task.execute(count);
}
public void showDialog(Dialog dialog)
{
dialog.show();
}
public void dismissDialog(Dialog dialog)
{
dialog.dismiss();
}
public Activity getActivity(){
return this;
}
}
文件2
DialogResolver.java文件
package com.teleca.robin.Contact;
import android.app.Dialog;
public interface DialogResolver{
public void showDialog(Dialog dialog);
public void dismissDialog(Dialog dialog);
}
注意:对于任何实现了DialogResolver的类,要求该类必须是Activity。
文件3
布局文件main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ns:android=""
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<EditText
android:id="@+id/editText"
android:layout_width="100dp"
android:layout_height="wrap_content"
/>
<Button android:text="@string/add" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>
文件4
strings.xml文件
<? version="1.0" encoding="utf-8"?>
<ources>
<string name="hello">please input the number to add for contact!</string>
<string name="app_name">ContactGenerator</string>
<string name="">add</string>
<string name="insert_title">insert contact</string>
<string name="insert_tip">waiting</string>
</resources>
文件5
ContactPersistTask.java文件
package com.teleca.robin.Contact;
import java.util.ArrayList;
import java.util.Random;
import Android.app.Activity;
import android.app.ProgsDialog;
import ntent.ContentProviderOperation;
import ntent.ContentProviderResult;
import ntent.ContentResolver;
import ntent.ContentUris;
import ntent.ContentValues;
import ntent.Context;
import ntent.OperationApplicationException;
import android.os.AsyncTask;
import android.os.RemoteException;
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.Im;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.util.Log;
import android.widget.Toast;
import com.teleca.robin.model.EntityDelta;
import com.teleca.robin.model.EntitySet;
import com.teleca.robin.model.EntityDelta.ValuesDelta;
public class ContactPersistTask extends AsyncTask<Integer, Integer, Integer> {
private ProgsDialog mProgress;
Context context;
DialogResolver dialogResolver;
final static String ="robin";
public ContactPersistTask(DialogResolver dialogResolver) {
this.dialogResolver = dialogResolver;
ntext = (Activity) dialogResolver;
}
/** {@inheritDoc} */
@Override
protected void onPreExecute() {
mProgress = new ProgressDialog((Activity) context);
mProgress.setTitle(R.string.insert_title);
mProgress.setMessage(context.getText(R.string.insert_tip));
mProgress.setProgress(0);
mProgress.setMax(100);
mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialogResolver.showDialog(mProgs);
}
public static EntitySet generateRawContactSet(int count) {
EntityDelta rawContact = generateRawContact();
EntitySet entitySet = EntitySet.fromSingle(rawContact);
for (int i = 1; i < count; i++) {
entitySet.(generateRawContact());
}
return entitySet;
}
public static EntityDelta generateRawContact() {
String accountType = null;
String accountName = null;
ContentValues contentValues = new ContentValues();
contentValues.put(RawContacts.ACCOUNT_TYPE, accountType);
contentValues.put(RawContacts.ACCOUNT_NAME, accountName);
ValuesDelta values = ValuesDelta.fromAfter(contentValues);
EntityDelta rawContact = new EntityDelta(values);
// name
ContentValues nameValues = new ContentValues();
nameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
nameValues.put(StructuredName.FAMILY_NAME, generateFamilyName());
nameValues.put(StructuredName.GIVEN_NAME, generateGivenName());
rawContact.Entry(ValuesDelta.fromAfter(nameValues));
// phone number
ContentValues phoneValues = new ContentValues();
phoneValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
phoneValues.put(Phone.NUMBER, generateMobilePhone());
phoneValues.put(Phone.TYPE, Phone.TYPE_CUSTOM);
rawContact.addEntry(ValuesDelta.fromAfter(phoneValues));
phoneValues = new ContentValues();
phoneValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
phoneValues.put(Phone.NUMBER, generateHomePhone());
phoneValues.put(Phone.TYPE, Phone.TYPE_HOME);
rawContact.Entry(ValuesDelta.fromAfter(phoneValues));
ContentValues emailValues = new ContentValues();
emailValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
emailValues.put(Email.ADDRESS, generateEmail());
emailValues.put(Email.TYPE, Email.TYPE_HOME);
rawContact.addEntry(ValuesDelta.fromAfter(emailValues));
emailValues = new ContentValues();
emailValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
emailValues.put(Email.ADDRESS, generateEmail());
emailValues.put(Email.TYPE, Email.TYPE_MOBILE);
rawContact.Entry(ValuesDelta.fromAfter(emailValues));
// group
/*
* ContentValues groupValues=new ContentValues();
* groupValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
* groupValues.put(GroupMembership.GROUP_ROW_ID, "0");
*/
// IM
ContentValues imValues = new ContentValues();
imValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
imValues.put(Im.DATA, generateQQ());
imValues.put(Im.TYPE, Im.TYPE_CUSTOM);
imValues.put(Im.PROTOCOL, Im.PROTOCOL_QQ);
rawContact.addEntry(ValuesDelta.fromAfter(imValues));
imValues = new ContentValues();
imValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
imValues.put(Im.DATA, generateMSN());
imValues.put(Im.TYPE, Im.TYPE_WORK);
imValues.put(Im.PROTOCOL, Im.PROTOCOL_MSN);
rawContact.addEntry(ValuesDelta.fromAfter(imValues));
// Postal ress
/*
* ContentValues postalAddressValues=new ContentValues();
* postalAddressValues.put(Data.MIMETYPE,
* StructuredPostal.CONTENT_ITEM_TYPE);
* postalAddressValues.put(StructuredPostal
* .TYPE,StructuredPostal.TYPE_HOME);
*/
return rawContact;
}
final static String familyNames[] = { "hu", "yang", "wang", "li", "zhang",
"", "zhu", "zheng", "tao", "liu", "wen", "zhao", "zu", "xu",
"zhou", "ling", "nu", "luo", "wuang", "liao", "yuan", "", "he",
"guo", "nuo", "bai" };
final static Random random = new Random(System.currentTimeMillis());
public static String generateFamilyName() {
int len = familyNames.length;
int index = random.nextInt() % len;
index = (index + len) % len;
return familyNames[index];
}
final static String giveNames[] = { "bing", "wei", "qiang", "chao", "qing",
"yang", "xing chi", "bin", "qi chao", "guo wei" ,"xi","tao","guo rong"};
public static String generateGivenName() {
int len = giveNames.length;
int index = random.nextInt() % len;
index = (index + len) % len;
int number = random.nextInt() % 100;
if (number < 0)
return giveNames[index];
else
return giveNames[index] + number;
}
public static String generateMSN() {
int number = random.nextInt() % 100;
if (number < 0) {
return "";
} else {
return "hubinforever" + number + "";
}
}
public static String generateQQ() {
int number = random.nextInt() % 1000;
if (number < 0) {
return "248600690";
} else {
return "248600" + number;
}
}
final static String kEmailPrefix[] = { "hh", "hubing", "abc" };
final static String kEmailSuffix[] = { "", "", "",
"" };
public static String generateEmail() {
int prefixIndex = random.nextInt() % kEmailPrefix.length;
if (prefixIndex < 0) {
prefixIndex = 0;
}
int suffixIndex = random.nextInt() % kEmailSuffix.length;
if (suffixIndex < 0)
suffixIndex = 0;
int number = random.nextInt() % 1000;
if (number < 0) {
return kEmailPrefix[prefixIndex] + kEmailSuffix[suffixIndex];
} else {
return kEmailPrefix[prefixIndex] + number
+ kEmailSuffix[suffixIndex];
}
}
final static StringBuffer strBuffer = new StringBuffer();
public static String generateHomePhone() {
strBuffer.delete(0, strBuffer.length());
strBuffer.append("028");
for (int i = 0; i < 8; i++) {
int number = random.nextInt() % 10;
if (number < 0)
number = 8;
strBuffer.append(number);
}
return strBuffer.toString();
}
final static String kMobilePrefix[] = { "135", "138", "139", "189", "130" };
public static String generateMobilePhone() {
strBuffer.delete(0, strBuffer.length());
int number = random.nextInt() % kMobilePrefix.length;
if (number < 0)
number = 0;
strBuffer.append(kMobilePrefix[number]);
for (int i = 0; i < 8; i++) {
number = random.nextInt() % 10;
if (number < 0)
number = 8;
strBuffer.append(number);
}
return strBuffer.toString();
}
final static int kInsertOnceLimit = 10;
/** {@inheritDoc} */
@Override
protected Integer doInBackground(Integer... count) {
final ContentResolver olver = context.getContentResolver();
int complement = count[0] % kInsertOnceLimit;
EntitySet rawContactSet = null;
int size = 0;
for (int i = count[0]; i > 0; i = i - kInsertOnceLimit) {
if (i >= kInsertOnceLimit) {
rawContactSet = generateRawContactSet(kInsertOnceLimit);
} else
rawContactSet = generateRawContactSet(complement);
rawContactSet.splitRawContacts();
publishProgress((kInsertOnceLimit*100/count[0])/4);
// Build operations and try applying
final ArrayList<ContentProviderOperation> diff = rawContactSet
.buildDiff();
ContentProviderResult[] ults = null;
if (!diff.isEmpty()) {
try {
results = resolver.applyBatch(ContactsContract.AUTHORITY,
diff);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OperationApplicationException e) {
// TODO Auto-generated catch
e.printStackTrace();
}
}
publishProgress((kInsertOnceLimit*100/count[0])/2);
boolean = refreshRawContactId(rawContactSet, diff, results);
publishProgress((kInsertOnceLimit*100/count[0])/4);
size = size + rawContactSet.size();
Log.i(, "size:"+size);
}
return size;
}
protected void onProgressUpdate(Integer... progress) {
mProgress.incrementProgressBy(progress[0]);
}
final static ArrayList<Long> rawContactIdList = new ArrayList<Long>(
kInsertOnceLimit);
private boolean refreshRawContactId(EntitySet entitySet,
final ArrayList<ContentProviderOperation> diff,
final ContentProviderResult[] ults) {
rawContactIdList.clear();
rawContactId;
final int diffSize = diff.size();
for (int i = 0; i < diffSize; i++) {
ContentProviderOperation operation = diff.get(i);
if (operation.getType() == ContentProviderOperation.TYPE_INSERT
&& operation.getUri().getEncodedPath(ntains(
RawContacts.CONTENT_URI.getEncodedPath())) {
rawContactId = ContentUris.parseId(results[i].uri);
rawContactIdList.(rawContactId);
}
}
int size = entitySet.size();
EntityDelta entityDelta = null;
int k = 0;
for (int i = 0; i < size; i++) {
entityDelta = entitySet.get(i);
if (entityDelta.isContactInsert())
k++;
}
if (k != rawContactIdList.size())
{
Log.i(, "refh rawContactId fail!");
return false;
}
for (int i = 0; i < size; i++) {
if (entityDelta.isContactInsert())
{
entityDelta = entitySet.get(i);
rawContactId=rawContactIdList.get(i);
entityDelta.getValues().put(RawContacts._ID,rawContactId);
}
}
return true;
}
@Override
protected void onPostExecute(Integer result) {
Toast.makeText(context, "insert " + result + " Contacts success!",
Toast.LENGTH_SHORT).show();
dialogResolver.dismissDialog(mProgs);
}
}
转载地址:http://efici.baihongyu.com/