import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts.Data;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private Button exportBtn;// 导出按钮
private TextView showText;// 显示进度的文本
// 导出txt的存放位置
private final static String OUTPUT_PATH = Environment
.getExternalStorageDirectory() + "/我的联系人.txt";
private static final int OUTPUT_FAIL = 0;// 导出失败标识
private static final int OUTPUT_SUCCESS = 1;// 导出成功标识
private static int count;// 导出联系人的计数
private Thread mOutputThread;// 导出联系人线程
// 空格
private static final String SPACE_1 = " ";
private static final String SPACE_2 = SPACE_1 + SPACE_1;
private static final String SPACE_4 = SPACE_2 + SPACE_2;
private static final String SPACE_8 = SPACE_4 + SPACE_4;
private static final String SPACE_11 = SPACE_8 + SPACE_2 + SPACE_1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
exportBtn = (Button) findViewById(R.id.main_btn_export);
exportBtn.setOnClickListener(this);
showText = (TextView) findViewById(R.id.main_tv_show);
}
@Override
public void onClick(View v) {
if (v == exportBtn) {
outputContact();
}
}
/**
* 导出联系人入口
*/
private void outputContact() {
File file = new File(OUTPUT_PATH);
if (!file.exists()) {
startOutputContact();
} else {
createDialog(this, "警告", "我的联系人.txt已经存在,是否覆盖?");
}
}
/**
* 创建提示对话框
*
* @param context
* @param title
* @param message
*/
private void createDialog(Context context, String title, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
startOutputContact();
}
});
builder.setNeutralButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
});
builder.show();
}
/**
* 开启导出联系人子线程
*/
private void startOutputContact() {
setOutputWidgetEnabled(false);
showText.setText("正在导出联系人...");
if (mOutputThread != null) {
mOutputThread.interrupt();
mOutputThread = null;
}
mOutputThread = new Thread(new OutputRunnable(this));
if (mOutputThread != null) {
mOutputThread.start();
}
}
/**
* 设置导出组件的可用性
*/
private void setOutputWidgetEnabled(boolean enabled) {
exportBtn.setEnabled(enabled);
if (!enabled) {
showText.setText("");
}
}
class OutputRunnable implements Runnable {
private Context context;
public OutputRunnable(Context context) {
this.context = context;
}
@Override
public void run() {
boolean result = doOutputContact(context);
if (result) {
handler.sendEmptyMessage(OUTPUT_SUCCESS);
} else {
handler.sendEmptyMessage(OUTPUT_FAIL);
}
}
}
/**
* 处理UI提示相关
*/
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == OUTPUT_SUCCESS) {
showText.setText((String.format("已成功导出 %d 条联系人记录", count)));
setOutputWidgetEnabled(true);
} else if (msg.what == OUTPUT_FAIL) {
showText.setText("导入联系人失败");
setOutputWidgetEnabled(true);
}
}
};
/**
* 从数据库中导出联系人
*
* @param context
* @return 是否成功
*/
private boolean doOutputContact(Context context) {
count = 0;
try {
String result = readFromContactDatabase(context);
writeFile(OUTPUT_PATH, result);
} catch (Exception e) {
return false;
}
return true;
}
/**
* 从数据库中读取联系人相关信息
*
* @param context
* @return 信息结果
*/
private String readFromContactDatabase(Context context) {
StringBuilder resultBuilder = new StringBuilder();
Cursor cursor = context
.getContentResolver()
.query(ContactsContract.Data.CONTENT_URI,
new String[] { StructuredName.DISPLAY_NAME,
Data.RAW_CONTACT_ID }, Data.MIMETYPE + "= ?",
new String[] { StructuredName.CONTENT_ITEM_TYPE }, null);
while (cursor.moveToNext()) {
// 得到名称和每一行记录的ID
String displayName = cursor.getString(0);
int id = cursor.getInt(1);
// 得到电话号码的游标
Cursor mobileCursor = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[] { Phone.NUMBER },
Data.RAW_CONTACT_ID + " = " + id + " AND " + Data.DATA2
+ " = " + 2, null, null);
String mobileNum = "";
if (mobileCursor.moveToNext()) {
mobileNum = mobileCursor.getString(0);
}
mobileCursor.close();
// 得到家庭电话
Cursor homeCursor = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[] { Phone.NUMBER },
Data.RAW_CONTACT_ID + " = " + id + " AND " + Data.DATA2
+ " = " + 1, null, null);
String homeNum = "";
if (homeCursor.moveToNext()) {
homeNum = homeCursor.getString(0);
}
homeCursor.close();
if (displayName != null && !"".equals(displayName)) {
String result = displayName + SPACE_4;
if ("".equals(mobileNum)) {
result += SPACE_11;
} else {
result += mobileNum;
}
result += SPACE_8 + homeNum + '\n';
String checkString = resultBuilder.toString();
if (!checkString.contains(result)
&& ("".equals(mobileNum) || !checkString
.contains(mobileNum))) {
resultBuilder.append(result);
count++;
}
}
}
cursor.close();
return resultBuilder.toString();
}
/**
* 将联系人信息写入SD
*
* @param path
* @param info
*/
private void writeFile(String path, String info) {
try {
File file = new File(path);
FileWriter writer = new FileWriter(file, false);
writer.write(info);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<button
android:id="@+id/main_btn_export"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="导出联系人">
</button>
<textview
android:id="@+id/main_tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</textview>
</linearlayout>
<uses-permission android:name="android.permission.READ_CONTACTS">
<uses-permission android:name="android.permission.WRITE_CONTACTS">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">