原创文档,转载请保留原文url地址
介绍
新购买了android手机,感觉很好, 新问题也来了, 如何把iphone手机中通讯簿导入到 android中。
在百度中搜索,有几个软件可以完成这个功能。 大家可以去百度搜索。
最近在学习android的开发, 因此考虑通过程序来实现这个功能。
下面介绍根据网络上教程来实现android手机通讯薄访问教程
参考教程
建议大家先看一遍教程有一遍初步的了解, 然后创建一个android项目, 然后依照教程中的信息,将代码一一敲入, 然后启动模拟器调试程序, 最后接入android真机测试相关程序.
视频中, 请密切注意如何介绍的发现通讯录的存储方式,通过导入sqlite数据库, 了解源代码,分析相关android代码,得到通讯录的读写方法,这个研究方法是以后编写android代码必须的手段。另外其他通讯录的读写api也可以参考
程序实现中需要android的ContentProvider等相关知识等, 大家可以参考:
相关情况如下:
1. 创建android项目
2. 编写项目源代码
根据相关视频介绍, 编写相关源代码
项目创建完成后项目结构如下:
3. 项目源文件
AndroidManifest.xml文件, 通过在文件中添加main类, 以及相关应用程序的权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.iigrowing.android.input.contact.activity"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name="cn.iigrowing.android.input.contact.activity.SaveActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<!-- 互联网访问权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 通讯录读权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<!-- 通讯录写权限 -->
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
</manifest>
SaveActivity.java 类
package cn.iigrowing.android.input.contact.activity;
import java.util.ArrayList;
import android.app.Activity;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SaveActivity extends Activity {
private Button btnAdd;
private Button btnBtAdd;
private Button btnShow;
private EditText editEmail;
private EditText editName;
private EditText editTel;
private TextView txtResult;
// 事件处理程序
private OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnAdd:
String name = editName.getText().toString();
String tel = editTel.getText().toString();
String email = editEmail.getText().toString();
AddContact(name, tel, email);
break;
case R.id.btnBtAdd:
name = editName.getText().toString();
tel = editTel.getText().toString();
email = editEmail.getText().toString();
BtAddContact(name, tel, email);
break;
case R.id.btnShow:
ShowContacts();
break;
}
}
};
// 将用户名, 电话号码, email信息添加到 通讯薄中
public void AddContact(String name, String tel, String email) {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver resolver = this.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", name);
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", tel);
resolver.insert(uri, values);
// add 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", email);
resolver.insert(uri, values);
}
// 通过批量处理的办法将用户信息等,添加到通讯薄中
// 这个批处理中, 若是某个操作有问题,则整个取消,类似事物的概念, 只是根据教程的介绍, 没有测试过
public void BtAddContact(String name, String tel, String email) {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver resolver = this.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");
ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri)
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype", "vnd.android.cursor.item/name")
.withValue("data2", name).build();
operations.add(op2);
ContentProviderOperation op3 = ContentProviderOperation.newInsert(uri)
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype", "vnd.android.cursor.item/phone_v2")
.withValue("data1", tel).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", email).withValue("data2", "2").build();
operations.add(op4);
try {
resolver.applyBatch("com.android.contacts", operations);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OperationApplicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.save);
btnAdd = (Button) findViewById(R.id.btnAdd);
btnShow = (Button) findViewById(R.id.btnShow);
btnBtAdd = (Button) findViewById(R.id.btnBtAdd);
editName = (EditText) findViewById(R.id.editName);
editTel = (EditText) findViewById(R.id.editTel);
editEmail = (EditText) findViewById(R.id.editEmail);
txtResult = (TextView) findViewById(R.id.txtResult);
btnAdd.setOnClickListener(listener);
btnShow.setOnClickListener(listener);
btnBtAdd.setOnClickListener(listener);
}
// 显示联系人列表
public void ShowContacts() {
Uri uri = Uri.parse("content://com.android.contacts/contacts");
ContentResolver resolver = this.getContentResolver();
Cursor cursor = resolver.query(uri, new String[] { "_id" }, null, null,
null);
StringBuilder sb = new StringBuilder("contactid=");
while (cursor.moveToNext()) {
int contactid = cursor.getInt(0);
sb.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("mimetype"));
if ("vnd.android.cursor.item/name".equals(type)) {
sb.append(",name=" + data);
} else if (("vnd.android.cursor.item/email_v2").equals(type)) {
sb.append(",email=" + data);
} else if (("vnd.android.cursor.item/phone_v2").equals(type)) {
sb.append(",phone=" + data);
}
}
Log.i("aaa", sb.toString());
sb.append("\r\n");
}
txtResult.setText(sb.toString());
}
}
Save.xml 布局文件
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="姓名:"
android:textSize="20sp"
android:textStyle="bold" />
<EditText
android:id="@+id/editName"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="www.iigrowing.cn" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="电话:"
android:textSize="20sp"
android:textStyle="bold" />
<EditText
android:id="@+id/editTel"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="13661168171" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="email:"
android:textSize="20sp"
android:textStyle="bold" />
<EditText
android:id="@+id/editEmail"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="iig001@qq.com" />
</TableRow>
<Button
android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单步添加" />
<Button
android:id="@+id/btnShow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示列表" />
<Button
android:id="@+id/btnBtAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="事务添加" />
<TextView
android:id="@+id/txtResult"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0.68"
android:textSize="20sp"
android:textStyle="bold" />
</TableLayout>
4. 启动模拟器进行相关测试
如上图1,点击按钮启动虚拟机管理器, 点击2处按钮启动虚拟器, 选择图中3处选项, 最后选择4处按钮,启动相关模拟器。
5. 模拟器部署应用程序
如上图,请在1处(必须是项目名称上)选择右键,在弹出的菜单上选择run as菜单, 然选择 android application按钮
程序运行后界面如上图, 点击单步添加按钮
点击图中按钮切换到主屏
按上图中按钮
选择上图中联系人标签
显示刚刚添加的信息
6. 设置断点,调试应用程序
如上图, 在文件中设置断点
然后参照下图
在1处,点击右键, 选择2处按钮, 最后选择启动android application
若是出现下面对话框,选择如下选项, 然后选择yes按钮
如上图, 进入了调试模式,在图中1处, 程序中断运行, 图中2区域堆栈信息, 图中3处显示变量信息, 图中4中显示控制台信息, 图中5处显示android的日志信息
7. 调试设备
插入android手机,部署程序, 在弹出的对话框中, 选择手机设备。
在使用手机设备时, 请确保手机的设备驱动程序被完好安装完成, 同时在手机的选项中,将开发人员选项打开到调试模式。
当需要调试设备时,首先保证上面操作完成, 然后通过usb线连接手机到开发机中, 然后在eclipse中选择运行或者调试,然后选择相应设备。最后运行。
参考项目如下:
后续, 添加如何从iphone中导出通讯录到android手机中的具体步骤。