android 通讯录的兑现

android 通讯录的实现

    暑假第五十三天,好多天没有更新博客了,貌似这十多天都在一直在关注这奥运会的赛事,现在奥运会结束了,自己也该学习了,看看最近实现的通讯录吧,能实现简单的增加联系人、删除联系人、设置私密账号、点击item可以对该联系人进行通话、调用系统的拨号界面、备份数据、恢复数据简单的功能!然后呢,接着咱就可以看看实现的过程

首先先看一下布局

1。欢迎界面的布局startimage.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/startimage"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:src="@drawable/welcome" >

</ImageView>

2.接着是主界面main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg"
    >
	
	<FrameLayout
		android:id="@+id/list_ll"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		>
		<ListView 
		android:id="@+id/lv_userlist" 
		android:layout_above="@+id/gv_buttom_menu"
		android:layout_width="fill_parent" 
		android:layout_height="wrap_content"/>

		<!-- <TextView
        android:id="@+id/tvLetter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/textviewbg"
        android:gravity="center"
        android:maxWidth="50dp"
        android:minWidth="50dp"
        android:textColor="#FF6100"
        android:textSize="50sp" />

     <com.wang.A_Z.ListA_Z
        android:id="@+id/myView"
        android:layout_width="30dip"
        android:layout_height="fill_parent"
        android:layout_gravity="right" /> -->
				
		
	</FrameLayout>
	

		<GridView 
		android:id="@+id/gv_buttom_menu" 
		android:layout_height="80dp"
		android:layout_width="fill_parent" 
		android:layout_alignParentBottom="true"
		android:visibility="gone">
		</GridView>

		<LinearLayout 
		android:id="@+id/ll_search"
		android:layout_width="fill_parent" 
		android:layout_height="wrap_content"
		android:layout_centerVertical="true" 
		android:layout_alignParentLeft="true"
		android:layout_above="@+id/gv_buttom_menu"
		android:visibility="gone">
		<EditText 
			android:id="@+id/et_search" 
			android:layout_width="fill_parent"
			android:layout_height="wrap_content" 
			android:hint="请输入查询的号码或姓名"
			android:textSize="18dp">
		</EditText>
		
	</LinearLayout>


</RelativeLayout>
3.接着呢,就是增加联系人的界面布局addnewcontacts.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" 
	android:layout_height="fill_parent"
	android:orientation="vertical">
	<ScrollView android:layout_weight="4" 
				android:id="@+id/ScrollView1"
				android:layout_width="fill_parent" 
				android:layout_height="wrap_content"
				android:scrollbars="vertical">
		<LinearLayout 
			xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent"
			android:layout_height="wrap_content"
			android:orientation="vertical">
			<LinearLayout
			android:id="@+id/widget205"
			android:layout_width="fill_parent"
			android:layout_height="wrap_content"
			android:layout_marginLeft="10dp"
			android:layout_marginRight="10dp"
			>
				
				<ImageButton
				android:id="@+id/image_button"
				android:layout_width="60px"
				android:layout_height="60px"
				android:src="@drawable/icon"
				android:scaleType="centerCrop"
				>
				</ImageButton>
				<EditText 
					android:id="@+id/username" 
					android:layout_width="fill_parent"
					android:layout_height="wrap_content" 
					android:scrollbars="vertical"
					android:hint="姓名" 
					android:gravity="top"
					android:layout_gravity="center_vertical"
					 />
			</LinearLayout>
			
			
			<LinearLayout 
				android:layout_width="fill_parent"
				android:layout_height="wrap_content" 
				android:orientation="vertical"
				android:layout_marginRight="10dp" 
				android:layout_marginLeft="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="手机:"
					android:textSize="20dp" />
				<EditText 
					android:id="@+id/mobilephone"
					android:layout_width="fill_parent" 
					android:layout_height="wrap_content"
					android:scrollbars="vertical" 
					android:gravity="top" 
					android:hint="手机"
					android:phoneNumber="true" />
			</LinearLayout>
			<LinearLayout 
					android:layout_width="fill_parent"
					android:layout_height="wrap_content" 
					android:orientation="vertical"
					android:layout_marginLeft="10dp" 
					android:layout_marginRight="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="办公室电话:"
					android:textSize="20dp" />
				<EditText 
					android:id="@+id/officephone"
					android:layout_width="fill_parent" 
					android:layout_height="wrap_content"
					android:scrollbars="vertical" 
					android:phoneNumber="true"
					android:hint="办公室电话" 
					android:gravity="top" />
			</LinearLayout>
			<LinearLayout 
					android:layout_width="fill_parent"
					android:layout_height="wrap_content" 
					android:orientation="vertical"
					android:layout_marginLeft="10dp" 
					android:layout_marginRight="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="家庭电话:"
					android:textSize="20dp" />
				<EditText 
					android:id="@+id/familyphone"
					android:layout_width="fill_parent" 
					android:layout_height="wrap_content"
					android:scrollbars="vertical" 
					android:phoneNumber="true"
					android:hint="家庭电话" 
					android:gravity="top" />
			</LinearLayout>
			<LinearLayout 
					android:layout_width="fill_parent"
					android:layout_height="wrap_content" 
					android:orientation="vertical"
					android:layout_marginLeft="10dp" 
					android:layout_marginRight="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="职务职称:"
					android:textSize="20dp" />
				<EditText 
					android:id="@+id/position" 
					android:layout_width="fill_parent"
					android:layout_height="wrap_content" 
					android:scrollbars="vertical"
					android:hint="职务职称" 
					android:gravity="top" />
			</LinearLayout>
			
			
		
			<LinearLayout 
				android:layout_width="fill_parent"
				android:layout_height="wrap_content" 
				android:orientation="vertical"
				android:layout_marginLeft="10dp" 
				android:layout_marginRight="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="单位名称:"
					android:textSize="20dp" />
				<EditText 
					android:id="@+id/company" 
					android:layout_width="fill_parent"
					android:layout_height="wrap_content" 
					android:scrollbars="vertical"
					android:hint="单位名称" 
					android:gravity="top" />
			</LinearLayout>
			<LinearLayout 
				android:layout_width="fill_parent"
				android:layout_height="wrap_content" 
				android:orientation="vertical"
				android:layout_marginLeft="10dp" 
				android:layout_marginRight="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="地址:"
					android:textSize="20dp" />
				<EditText 
					android:id="@+id/address"
					android:layout_width="fill_parent" 
					android:layout_height="wrap_content"
					android:scrollbars="vertical" 
					android:hint="地址" 
					android:gravity="top" />
			</LinearLayout>
			<LinearLayout 
				android:layout_width="fill_parent"
				android:layout_height="wrap_content" 
				android:orientation="vertical"
				android:layout_marginLeft="10dp" 
				android:layout_marginRight="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="邮政编码:"
					android:textSize="20dp" />
				<EditText 
					android:id="@+id/zipcode"
					android:layout_width="fill_parent" 
					android:layout_height="wrap_content"
					android:scrollbars="vertical" 
					android:hint="邮政编码" 
					android:gravity="top" />
			</LinearLayout>
			<LinearLayout 
				android:layout_width="fill_parent"
				android:layout_height="wrap_content" 
				android:orientation="vertical"
				android:layout_marginLeft="10dp" 
				android:layout_marginRight="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="E-mail:"
					android:textSize="20dp" />
				<EditText 
					android:id="@+id/email" 
					android:layout_width="fill_parent"
					android:layout_height="wrap_content" 
					android:scrollbars="vertical"
					android:hint="E-mail" android:gravity="top" />
			</LinearLayout>
			
			<LinearLayout 
				android:layout_width="fill_parent"
				android:layout_height="wrap_content" 
				android:orientation="vertical"
				android:layout_marginLeft="10dp" 
				android:layout_marginRight="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="其他联系方式:"
					android:textSize="20dp" />
				<EditText 
					android:id="@+id/othercontact"
					android:layout_width="fill_parent" 
					android:layout_height="wrap_content"
					android:scrollbars="vertical" 
					android:hint="其他联系方式"
					android:gravity="top" />
			</LinearLayout>
			<LinearLayout 
				android:layout_width="fill_parent"
				android:layout_height="wrap_content" 
				android:orientation="vertical"
				android:layout_marginLeft="10dp" 
				android:layout_marginRight="10dp">
				<TextView 
					android:layout_height="wrap_content"
					android:layout_width="wrap_content" 
					android:text="备注:"
					android:textSize="20dp" />
				<EditText android:id="@+id/remark" 
					android:layout_width="fill_parent"
					android:layout_height="wrap_content" 
					android:scrollbars="vertical"
					android:hint="备注" android:gravity="top" />
			</LinearLayout>
		</LinearLayout>
	</ScrollView>
	<LinearLayout 
				android:layout_width="fill_parent"
				android:layout_height="wrap_content" 
				android:orientation="horizontal"
				android:layout_marginLeft="10dp" 
				android:layout_marginRight="10dp">
	<Button 
		android:id="@+id/save"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:layout_weight="1"
		android:text="保存"/>
		<Button 
		android:id="@+id/btn_return"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:layout_weight="1"
		android:text="返回"/>
		</LinearLayout>
</LinearLayout>

4.接着是图片选择的对话框界面的imageswitch.xml的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget34"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <Gallery
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="110px"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="10px" >
    </Gallery>

    <ImageSwitcher
        android:id="@+id/imageswitch"
        android:layout_width="90px"
        android:layout_height="90px"
        android:layout_alignBottom="@+id/gallery"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" >
    </ImageSwitcher>

</RelativeLayout>
5.接着是list列表的界面listitem.xml的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget33"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/user_image"
        android:layout_width="50px"
        android:layout_height="53px"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ImageView>

    <LinearLayout
        android:id="@+id/linerlayout"
        android:layout_width="fill_parent"
        android:layout_height="53px"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/user_image"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="25px"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/tv_showname"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="top"
                android:text="姓名:"
                android:textColor="#000000"
                android:textSize="17sp" />

            <TextView
                android:id="@+id/tv_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="7"
                android:gravity="left"
                android:textColor="#000000"
                android:textSize="17sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="25px"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/tv_showmobilephone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="left"
                android:text="手机:"
                android:textColor="#000000"
                android:textSize="17sp" />

            <TextView
                android:id="@+id/tv_mobilephone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="7"
                android:gravity="left"
                android:textColor="#000000"
                android:textSize="20sp" />
        </LinearLayout>
    </LinearLayout>

    <ImageView
        android:id="@+id/user_mark"
        android:layout_width="60px"
        android:layout_height="15px"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/checkmark"
        android:visibility="gone" />

</RelativeLayout>
6.接下来是点击menu键的item_menu.xml的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout_Item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="5dip" >

    <ImageView
        android:id="@+id/item_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" >
    </ImageView>

    <TextView
        android:id="@+id/item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/item_image"
        android:layout_centerHorizontal="true" >
    </TextView>

</RelativeLayout>

7.然后是在点击menu键后,点击item_menu上的监听事件查找电话号码的numchoose.xml 的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget28"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_numchoose"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="请选择一个号码"
        android:textSize="17sp"
        android:typeface="serif" >
    </TextView>

    <ListView
        android:id="@+id/num_list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

8.接着是在点击menu键后,点击item_menu上的监听事件管理通讯录的监听事件main_menu_grid.xml的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<GridView
         android:id="@+id/gridview"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:numColumns="2"
         android:verticalSpacing="10dip"
         android:horizontalSpacing="10dip"
         android:stretchMode="columnWidth"
         android:gravity="center"
         />
  
</LinearLayout>
9.接着是在点击menu键后,点击item_menu上的监听事件管理备份文件夹的名称enterfilename.xml的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget29"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_enter_file_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="请输入备份文件的文件名\n该文件该置于SD卡的根目录zpContact文件夹下" >
    </TextView>

    <EditText
        android:id="@+id/et_enter_file_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </EditText>

</LinearLayout>

10.接着是一个备份时候进度条的布局backup_progress.xml的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget29"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ProgressBar
        android:id="@+id/pb_backup"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ProgressBar>

    <Button
        android:id="@+id/btn_backuup_ok"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="OK"
        android:visibility="gone" >
    </Button>

</LinearLayout>

11.接着呢就是5s钟的欢迎界面 startAnimation.java

package com.wang.Activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.widget.ImageView;

public class startAnimation extends Activity {
	ImageView startimage;
	AlphaAnimation startAnimation;

	protected void onCreate(Bundle savedInstanceState) {
		// 去除标题
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 取消状态栏,充满全屏
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.startimage);

		startimage = (ImageView) findViewById(R.id.startimage);
		// 设置动画的渐变效果逐渐增强
		startAnimation = new AlphaAnimation(0.0f, 1.0f);
		// 设置动画显示的时间为3s
		startAnimation.setDuration(5000);
		// 开始动画效果
		startimage.startAnimation(startAnimation);
		// 为动画效果设置监听事件
		startAnimation.setAnimationListener(new AnimationListener() {
			// ka开始
			@Override
			public void onAnimationStart(Animation animation) {
				// TODO Auto-generated method stub

			}

			// 重复
			@Override
			public void onAnimationRepeat(Animation animation) {
				// TODO Auto-generated method stub

			}

			// 动画结束
			@Override
			public void onAnimationEnd(Animation animation) {

				// 声明一个意图,启动一个新的Activity
				Intent intent = new Intent(startAnimation.this,
						AddressPhoneBookDemoActivity.class);
				// 启动新的Activity
				startActivity(intent);
			}
		});
		// 当点击图片的时候也可以进行跳转
		startimage.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(startAnimation.this,
						AddressPhoneBookDemoActivity.class);
				// 启动新的Activity
				startActivity(intent);
			}
		});
	}

}

12.然后就是跳转到主界面实现过程AddressPhoneBookDemoActivity.java

package com.wang.Activity;

import java.util.ArrayList;
import java.util.HashMap;

import com.wang.Db.DBHelper;
import com.wang.UserInfo.UserInfo;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;

public class AddressPhoneBookDemoActivity extends Activity {

	// 显示所有数据的ListView
	ListView lv;

	ArrayList list;

	// 拥有所有数据的Adapter
	SimpleAdapter adapter;
	// 屏幕下方的工具栏
	GridView bottomMenuGrid;
	// 主菜单的布局
	GridView mainMenuGrid;
	// 主菜单的视图
	View mainMenuView;

	// 装搜索框的linearlayout,默认情况下visibility=gone
	LinearLayout searchLinearout;
	FrameLayout mainLinearLayout;
	// 搜索框
	EditText et_search;
	EditText et_enter_file_name;

	// 主菜单的对话框
	AlertDialog mainMenuDialog;
	// 确认对话框
	AlertDialog confirmDialog;
	// 进度条对话框
	AlertDialog progressDialog;
	// 输入文件名的对话框
	AlertDialog enterFileNameDialog;
	// 表示保密状态
	boolean privacy = false;
	// 存储标记的数目
	int markedNum;
	// 存储标记条目的_id号
	ArrayList<Integer> deleteId;
	// 关键界面的文字
	String[] main_menu_itemName = { "显示所有", "删除所有", "备份数据", "还原数据", };
	// 管理界面的图片资源
	int[] main_menu_itemSource = { R.drawable.showall, R.drawable.delete,
			R.drawable.menu_backup, R.drawable.menu_restore, };

	String[] bottom_menu_itemName = { "增加", "查找", "删除", "管理", "拨号" };
	String fileName;
	// menu 的图片资源
	int[] bottom_menu_itemSource = { R.drawable.addphone, R.drawable.search,
			R.drawable.delete, R.drawable.manager, R.drawable.callphone };

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 去除标题
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 取消状态栏,充满全屏
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.main);

		// 实例化组件
		mainLinearLayout = (FrameLayout) findViewById(R.id.list_ll);

		DBHelper helper = new DBHelper(this);
		// 打开数据库,就打开这一次,因为Helper中的SQLiteDatabase是静态的。
		helper.openDatabase();
		// 拿到所有保密状态为privacy的用户的list
		list = helper.getAllUser(privacy);
		lv = (ListView) findViewById(R.id.lv_userlist);
		// 当通讯录中没有信息的时候
		if (list.size() == 0) {
			Drawable nodata_bg = getResources().getDrawable(
					R.drawable.nodata_bg);
			mainLinearLayout.setBackgroundDrawable(nodata_bg);
			setTitle("没有查到任何数据");
		}
		// 将数据与adapter集合起来
		adapter = new SimpleAdapter(this, list, R.layout.listitem,
				new String[] { "imageid", "name", "mobilephone" }, new int[] {
						R.id.user_image, R.id.tv_name, R.id.tv_mobilephone });
		// 将整合好的adapter交给listview,显示给用户看
		lv.setAdapter(adapter);

		// 当点击item时候,调用系统进行拨号
		lv.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// 得到item位置
				HashMap item = (HashMap) arg0.getItemAtPosition(arg2);
				// 得到item上的手机号
				String number = String.valueOf(item.get("mobilephone"))
						.toString();
				// 声明一个意图,调用系统的打电话程序
				Intent intent = new Intent();
				intent.setAction("android.intent.action.CALL");
				// 调用系统打电话必须+tel:
				intent.setData(Uri.parse("tel:" + number));
				startActivity(intent);
			}
		});
		// 设置ListView的背景为透明
		lv.setCacheColorHint(Color.TRANSPARENT);

		// 长按时间处理可以选中这样才可以删除联系人
		lv.setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				if (deleteId == null) {
					deleteId = new ArrayList<Integer>();
				}
				// 得到item的位置 _id
				HashMap item = (HashMap) arg0.getItemAtPosition(arg2);
				Integer _id = Integer.parseInt(String.valueOf(item.get("_id")));

				RelativeLayout r = (RelativeLayout) arg1;
				ImageView markedView = (ImageView) r.getChildAt(2);
				if (markedView.getVisibility() == View.VISIBLE) {
					markedView.setVisibility(View.GONE);
					deleteId.remove(_id);
				} else {
					markedView.setVisibility(View.VISIBLE);
					deleteId.add(_id);
				}
				return true;
			}

		});
		// 为list添加item设置背景颜色
		Drawable itembg = getResources().getDrawable(R.drawable.itembg);
		lv.setSelector(itembg);

	}

	/*****
	 * 点击menu键的处理事件
	 * 
	 * *
	 **/
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_MENU) {
			loadBottomMenu();
			if (bottomMenuGrid.getVisibility() == View.VISIBLE) {
				if (searchLinearout != null
						&& searchLinearout.getVisibility() == View.VISIBLE) {
					searchLinearout.setVisibility(View.GONE);
				}
				bottomMenuGrid.setVisibility(View.GONE);
			} else {
				bottomMenuGrid.setVisibility(View.VISIBLE);
			}
		}
		return super.onKeyDown(keyCode, event);
	}

	/*****
	 * 底部menu的item的处理
	 * 
	 * *
	 **/
	private void loadBottomMenu() {

		if (bottomMenuGrid == null) {
			// 设置menuitem的布局,实力化组件
			bottomMenuGrid = (GridView) findViewById(R.id.gv_buttom_menu);
			// 设置背景
			bottomMenuGrid.setBackgroundResource(R.drawable.item);
			// 设置每行列数
			bottomMenuGrid.setNumColumns(5);
			// 位置居中
			bottomMenuGrid.setGravity(Gravity.CENTER);
			// 垂直间隔
			bottomMenuGrid.setVerticalSpacing(10);
			// 水平间隔
			bottomMenuGrid.setHorizontalSpacing(10);
			// 设置菜单Adapter
			bottomMenuGrid.setAdapter(getMenuAdapter(bottom_menu_itemName,
					bottom_menu_itemSource));
			// / 监听底部菜单menu选项 的时间
			bottomMenuGrid.setOnItemClickListener(new OnItemClickListener() {
				public void onItemClick(AdapterView<?> arg0, View arg1, int id,
						long arg3) {

					switch (id) {
					case 0: {
						// 如果查找框不为空,并且查找框可见,则设置为不可见
						if (searchLinearout != null
								&& searchLinearout.getVisibility() == View.VISIBLE) {
							searchLinearout.setVisibility(View.GONE);
						}
						if (bottomMenuGrid.getVisibility() == View.VISIBLE) {
							bottomMenuGrid.setVisibility(View.GONE);
						}

						// 跳转到添加联系人的界面
						Intent intent = new Intent(
								AddressPhoneBookDemoActivity.this,
								AddNewContacts.class);
						startActivityForResult(intent, 3);
						break;
					}

					case 1:
						// 调用处理查找联系人的方法
						loadSearchLinearout();
						// ,并且查找框可见,则设置为不可见
						if (searchLinearout.getVisibility() == View.VISIBLE) {
							searchLinearout.setVisibility(View.GONE);
						} else {
							searchLinearout.setVisibility(View.VISIBLE);
							// 把后面的查找按钮做焦点
							et_search.requestFocus();
							et_search.selectAll();
						}
						break;

					case 2:
						// 删除联系人的方法
						// 如果查找框不为空,并且查找框可见,则设置为不可见
						if (searchLinearout != null
								&& searchLinearout.getVisibility() == View.VISIBLE) {
							searchLinearout.setVisibility(View.GONE);
						}
						if (deleteId == null || deleteId.size() == 0) {
							Toast.makeText(AddressPhoneBookDemoActivity.this,
									"亲,没有标记任何记录\n长按一条记录即可标记!!",
									Toast.LENGTH_LONG).show();
						} else {
							// 新建一个警告的对话框
							new AlertDialog.Builder(
									AddressPhoneBookDemoActivity.this)
									.setTitle(
											"确定要删除标记的" + deleteId.size()
													+ "条记录吗?")
									.setPositiveButton(
											"确定",
											// 确定按钮设置监听事件
											new DialogInterface.OnClickListener() {

												public void onClick(
														DialogInterface dialog,
														int which) {
													DBHelper helper = new DBHelper(
															AddressPhoneBookDemoActivity.this);

													// 调用数据库的删除函数进行删除记录
													helper
															.deleteMarked(deleteId);
													// 重置视图
													list = helper
															.getAllUser(privacy);
													// 声明一个适配器对象
													adapter = new SimpleAdapter(
															AddressPhoneBookDemoActivity.this,
															list,
															R.layout.listitem,
															new String[] {
																	"imageid",
																	"name",
																	"mobilephone" },
															new int[] {
																	R.id.user_image,
																	R.id.tv_name,
																	R.id.tv_mobilephone });
													lv.setAdapter(adapter);
													deleteId.clear();
												}
											}).setNegativeButton("取消", null)
									.create().show();
						}

						break;
					case 3:
						// 管理的界面
						// 如果查找框不为空,并且查找框可见,则设置为不可见
						if (searchLinearout != null
								&& searchLinearout.getVisibility() == View.VISIBLE) {
							searchLinearout.setVisibility(View.GONE);
						}
						// 调用loadMainMenuDialog的方法实现
						loadMainMenuDialog();
						mainMenuDialog.show();

						break;
					case 4:

						// 调用系统的打电话的界面
						Intent intent = new Intent(
								"android.intent.action.CALL_BUTTON");
						startActivity(intent);
						break;
					}
				}
			});
		}

	}

	/*****
	 * 底部管理 功能的实现方法
	 * 
	 * *
	 **/
	private void loadMainMenuDialog() {
		if (mainMenuDialog == null) {
			// 获得LayoutInflater从给定的上下文
			LayoutInflater inflater = LayoutInflater.from(this);
			mainMenuView = inflater.inflate(R.layout.main_menu_grid, null);
			// 根据主菜单视图,创建主菜单对话框
			mainMenuDialog = new AlertDialog.Builder(this)
					.setView(mainMenuView).create();

			// 实例化组件
			mainMenuGrid = (GridView) mainMenuView.findViewById(R.id.gridview);
			// 根据主菜单视图,获得视图文件中的GridView,然后再往里面放Adapter
			SimpleAdapter menuAdapter = getMenuAdapter(main_menu_itemName,
					main_menu_itemSource);
			mainMenuGrid.setAdapter(menuAdapter);
			// 设置管理界面的响应点击事件
			mainMenuGrid.setOnItemClickListener(new OnItemClickListener() {
				@Override
				public void onItemClick(AdapterView<?> arg0, View arg1,
						int arg2, long arg3) {
					switch (arg2) {
					case 0: {
						// 显示所有数据
						DBHelper helper = new DBHelper(
								AddressPhoneBookDemoActivity.this);
						list = helper.getAllUser(privacy);
						adapter = new SimpleAdapter(
								AddressPhoneBookDemoActivity.this, list,
								R.layout.listitem, new String[] { "imageid",
										"name", "mobilephone" }, new int[] {
										R.id.user_image, R.id.tv_name,
										R.id.tv_mobilephone });

						lv.setAdapter(adapter);
						mainMenuDialog.dismiss();
						break;
					}
					case 1: {
						// 是否删除所有数据
						// 创建一个对话框
						AlertDialog.Builder builder = new AlertDialog.Builder(
								AddressPhoneBookDemoActivity.this);
						confirmDialog = builder.create();
						builder.setTitle("是否删除所有!?");
						builder.setPositiveButton("确定",
						// 确定按钮的监听事件
								new DialogInterface.OnClickListener() {
									@Override
									public void onClick(DialogInterface dialog,
											int which) {
										DBHelper helper = new DBHelper(
												AddressPhoneBookDemoActivity.this);
										// 调用删除函数删除所有的数据
										helper.deleteAll(0);
										list = helper.getAllUser(privacy);
										adapter = new SimpleAdapter(
												AddressPhoneBookDemoActivity.this,
												list,
												R.layout.listitem,
												new String[] { "imageid",
														"name", "mobilephone" },
												new int[] { R.id.user_image,
														R.id.tv_name,
														R.id.tv_mobilephone });

										lv.setAdapter(adapter);
										mainMenuDialog.dismiss();
									}
								});
						builder.setNegativeButton("取消",
						// 取消按钮的监听事件
								new DialogInterface.OnClickListener() {
									@Override
									public void onClick(DialogInterface dialog,
											int which) {
										// 对话框消失
										confirmDialog.dismiss();
									}
								});
						builder.create().show();
						break;
					}
					case 2: {
						// 备份通讯录的处理
						// 对话框消失,重新新建一个对话框
						mainMenuDialog.dismiss();
						new AlertDialog.Builder(
								AddressPhoneBookDemoActivity.this)
								.setTitle("是否需要备份记录到SD卡?")
								.setPositiveButton("确定",
								// 确定按钮的监听事件
										new DialogInterface.OnClickListener() {
											@Override
											public void onClick(
													DialogInterface dialog,
													int which) {
												LayoutInflater inflater = LayoutInflater
														.from(AddressPhoneBookDemoActivity.this);
												// 获得一个新的视图层次从指定的xml资源
												View backup_view = inflater
														.inflate(
																R.layout.backup_progress,
																null);
												// 进度对话框显示
												progressDialog = new AlertDialog.Builder(
														AddressPhoneBookDemoActivity.this)
														.setTitle("备份正在进行中...")
														.setView(backup_view)
														.create();
												progressDialog.show();

												DBHelper helper = new DBHelper(
														AddressPhoneBookDemoActivity.this);
												// 调用数据库进行备份
												helper.backupData(privacy);

												ProgressBar bar = (ProgressBar) backup_view
														.findViewById(R.id.pb_backup);
												Button btn_backup_ok = (Button) backup_view
														.findViewById(R.id.btn_backuup_ok);
												bar.setMax(list.size());
												for (int i = 0; i <= list
														.size(); i++) {
													bar.setProgress(i);
												}
												// 进度对话框提示一下
												progressDialog
														.setTitle("备份完成!一共 "
																+ list.size()
																+ " 条记录");

												btn_backup_ok
														.setVisibility(View.VISIBLE);
												// ok按钮 的监听事件
												btn_backup_ok
														.setOnClickListener(new OnClickListener() {

															@Override
															public void onClick(
																	View v) {
																progressDialog
																		.dismiss();
																mainMenuDialog
																		.dismiss();
															}

														});
											}

										}).setNegativeButton("取消", null)
								.create()
								.show();
						break;
					}
					case 3: {
						// 还原数据的处理
						LayoutInflater layoutInflater = LayoutInflater
								.from(AddressPhoneBookDemoActivity.this);
						View enterFileNameView = layoutInflater.inflate(
								R.layout.enterfilename, null);
						// 还原备份的对话框
						enterFileNameDialog = new AlertDialog.Builder(
								AddressPhoneBookDemoActivity.this).setView(
								enterFileNameView)
								.setNegativeButton("取消", null)
								.setPositiveButton("确定",
										new DialogInterface.OnClickListener() {

											public void onClick(
													DialogInterface dialog,
													int which) {
												DBHelper helper = new DBHelper(
														AddressPhoneBookDemoActivity.this);
												// 得到备份数据的文件夹
												fileName = et_enter_file_name
														.getText().toString();
												if (helper.findFile(fileName)) {
													new AlertDialog.Builder(
															AddressPhoneBookDemoActivity.this)
															.setTitle("请选择方式")
															.setPositiveButton(
																	"覆盖",
																	// 覆盖数据的方法处理
																	new DialogInterface.OnClickListener() {

																		public void onClick(
																				DialogInterface dialog,
																				int which) {
																			DBHelper helper = new DBHelper(
																					AddressPhoneBookDemoActivity.this);
																			// 删除所有联系人
																			helper
																					.deleteAll(0);
																			// 恢复备份的联系人方法
																			helper
																					.restoreData(fileName);
																			// 显示所有联系人的方法
																			list = helper
																					.getAllUser(privacy);
																			adapter = new SimpleAdapter(
																					AddressPhoneBookDemoActivity.this,
																					list,
																					R.layout.listitem,
																					new String[] {
																							"imageid",
																							"name",
																							"mobilephone" },
																					new int[] {
																							R.id.user_image,
																							R.id.tv_name,
																							R.id.tv_mobilephone });
																			LayoutInflater li = LayoutInflater
																					.from(AddressPhoneBookDemoActivity.this);
																			View backup_view = li
																					.inflate(
																							R.layout.backup_progress,
																							null);
																			// 创建备份还原的数据对话框
																			progressDialog = new AlertDialog.Builder(
																					AddressPhoneBookDemoActivity.this)
																					.setTitle(
																							"正在还原数据...")
																					.setView(
																							backup_view)
																					.create();
																			progressDialog
																					.show();
																			ProgressBar bar = (ProgressBar) backup_view
																					.findViewById(R.id.pb_backup);

																			Button btn_backup_ok = (Button) backup_view
																					.findViewById(R.id.btn_backuup_ok);
																			bar
																					.setMax(list
																							.size());
																			for (int i = 0; i <= list
																					.size(); i++) {
																				bar
																						.setProgress(i);
																			}
																			progressDialog
																					.setTitle("还原完成!一共还原了 "
																							+ list
																									.size()
																							+ " 条记录");
																			btn_backup_ok
																					.setVisibility(View.VISIBLE);
																			btn_backup_ok
																					.setOnClickListener(new OnClickListener() {

																						@Override
																						public void onClick(
																								View v) {
																							progressDialog
																									.dismiss();
																							mainMenuDialog
																									.dismiss();
																							if (list
																									.size() != 0) {
																								mainLinearLayout
																										.setBackgroundDrawable(null);
																							}
																							lv
																									.setAdapter(adapter);

																						}

																					});
																		}
																	})
															// 添加按钮的监听事件
															.setNegativeButton(
																	"添加",
																	new DialogInterface.OnClickListener() {

																		@Override
																		public void onClick(
																				DialogInterface dialog,
																				int which) {
																			DBHelper helper = new DBHelper(
																					AddressPhoneBookDemoActivity.this);
																			int preNum = list
																					.size();
																			helper
																					.restoreData(fileName);
																			list = helper
																					.getAllUser(privacy);
																			adapter = new SimpleAdapter(
																					AddressPhoneBookDemoActivity.this,
																					list,
																					R.layout.listitem,
																					new String[] {
																							"imageid",
																							"name",
																							"mobilephone" },
																					new int[] {
																							R.id.user_image,
																							R.id.tv_name,
																							R.id.tv_mobilephone });
																			LayoutInflater li = LayoutInflater
																					.from(AddressPhoneBookDemoActivity.this);
																			View backup_view = li
																					.inflate(
																							R.layout.backup_progress,
																							null);
																			progressDialog = new AlertDialog.Builder(
																					AddressPhoneBookDemoActivity.this)
																					.setTitle(
																							"正在还原数据...")
																					.setView(
																							backup_view)
																					.create();
																			progressDialog
																					.show();
																			ProgressBar bar = (ProgressBar) backup_view
																					.findViewById(R.id.pb_backup);

																			Button btn_backup_ok = (Button) backup_view
																					.findViewById(R.id.btn_backuup_ok);
																			bar
																					.setMax(list
																							.size());
																			for (int i = 0; i <= list
																					.size(); i++) {
																				bar
																						.setProgress(i);
																			}
																			progressDialog
																					.setTitle("还原完成!一共还原了 "
																							+ (list
																									.size() - preNum)
																							+ " 条记录");
																			btn_backup_ok
																					.setVisibility(View.VISIBLE);
																			btn_backup_ok
																					.setOnClickListener(new OnClickListener() {

																						@Override
																						public void onClick(
																								View v) {
																							progressDialog
																									.dismiss();
																							mainMenuDialog
																									.dismiss();
																							lv
																									.setAdapter(adapter);
																						}

																					});
																		}
																	})
															// 取消按钮是监听事件
															.setNeutralButton(
																	"取消",
																	new DialogInterface.OnClickListener() {

																		@Override
																		public void onClick(
																				DialogInterface dialog,
																				int which) {

																		}
																	}).create()
															.show();

												} else {
													// 如果文件夹找不到提示一下
													Toast
															.makeText(
																	enterFileNameDialog
																			.getContext(),
																	"找不到备份文件",
																	Toast.LENGTH_LONG)
															.show();
												}
											}
										}).create();
						et_enter_file_name = (EditText) enterFileNameView
								.findViewById(R.id.et_enter_file_name);
						et_enter_file_name.setText("comm_data");
						et_enter_file_name.requestFocus();
						et_enter_file_name.selectAll();
						enterFileNameDialog.show();
						adapter = new SimpleAdapter(
								AddressPhoneBookDemoActivity.this, list,
								R.layout.listitem, new String[] { "imageid",
										"name", "mobilephone" }, new int[] {
										R.id.user_image, R.id.tv_name,
										R.id.tv_mobilephone });

						lv.setAdapter(adapter);
						// 显示所有数据
						mainMenuDialog.dismiss();
						break;
					}
					}

				}
			});
		}

	}

	/*****
	 * 查找联系人数据的处理函数
	 * 
	 * *
	 **/
	private void loadSearchLinearout() {

		if (searchLinearout == null) {
			// 实力化组件
			searchLinearout = (LinearLayout) findViewById(R.id.ll_search);
			et_search = (EditText) findViewById(R.id.et_search);
			// 查找的编辑框设置监听事件
			et_search.setOnKeyListener(new OnKeyListener() {

				public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
					// 声明一个查找的内容
					String condition = et_search.getText().toString();
					if (condition.equals("")) {
						lv.setAdapter(adapter);
					}
					DBHelper helper = new DBHelper(
							AddressPhoneBookDemoActivity.this);

					// DBHelper 中的getUsers 函数实现查找功能
					list = helper.getUsers(condition, privacy);
					// 为自己查找的数据设置一个新的适配器
					SimpleAdapter searchAdapter = new SimpleAdapter(
							AddressPhoneBookDemoActivity.this, list,
							R.layout.listitem, new String[] { "imageid",
									"name", "mobilephone" }, new int[] {
									R.id.user_image, R.id.tv_name,
									R.id.tv_mobilephone });
					// 将整合好的adapter交给listview,显示给用户看
					lv.setAdapter(searchAdapter);
					if (list.size() == 0) {
						// 如果没有联系人的时候设置背景为没有数据的图片
						Drawable nodata_bg = getResources().getDrawable(
								R.drawable.nodata_bg);
						mainLinearLayout.setBackgroundDrawable(nodata_bg);
						setTitle("没有查到任何数据");
					} else {
						setTitle("共查到 " + list.size() + " 条记录");

						// /如果查到后设置背景颜色为空
						mainLinearLayout.setBackgroundDrawable(null);
					}
					return false;
				}
			});

		}

	}

	/*******
	 * 一个简单的适配器映射到视图中定义的静态数据的XML文件 。您可以指定数据支持列表作为一个ArrayList的地图。
	 * ArrayList中的每个条目对应于一个排在列表中。 这个地图包含为每一行的数据。您还可以指定一个XML文件,
	 * 该文件定义视图用于显示的行,和一个映射键映射到特定的视图。 数据绑定到视图出现在两个阶段
	 * 
	 * *
	 **/
	private SimpleAdapter getMenuAdapter(String[] menuNameArray,
			int[] imageResourceArray) {
		ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < menuNameArray.length; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("itemImage", imageResourceArray[i]);
			map.put("itemText", menuNameArray[i]);
			data.add(map);
		}
		SimpleAdapter simperAdapter = new SimpleAdapter(this, data,
				R.layout.item_menu, new String[] { "itemImage", "itemText" },
				new int[] { R.id.item_image, R.id.item_text });
		return simperAdapter;
	}

	/*******
	 * 当退出的时候,回收资源
	 * 
	 ****/
	protected void onDestroy() {
		if (confirmDialog != null) {
			confirmDialog = null;
		}
		if (mainMenuDialog != null) {
			mainMenuDialog = null;
		}
		if (searchLinearout != null) {
			searchLinearout = null;
		}
		if (mainMenuView != null) {
			mainMenuView = null;
		}
		if (mainMenuGrid != null) {
			mainMenuGrid = null;
		}
		if (bottomMenuGrid != null) {
			bottomMenuGrid = null;
		}
		if (adapter != null) {
			adapter = null;
		}
		if (list != null) {
			list = null;
		}
		if (lv != null) {
			lv = null;
		}
		if (DBHelper.dbInstance != null) {
			DBHelper.dbInstance.close();
			DBHelper.dbInstance = null;
		}

		System.out.println("destory!!!");
		super.onDestroy();
	}

}

13.接着是添加联系人的活动界面AddNewContacts.java

package com.wang.Activity;

import com.wang.Db.DBHelper;
import com.wang.UserInfo.UserInfo;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.ImageButton;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ImageView.ScaleType;
import android.widget.ViewSwitcher.ViewFactory;

public class AddNewContacts extends Activity implements ViewFactory {

	EditText et_name;
	EditText et_mobilePhone;
	EditText et_officePhone;
	EditText et_familyPhone;
	EditText et_position;
	EditText et_company;
	EditText et_address;
	EditText et_zipCode;
	EditText et_otherContact;
	EditText et_email;
	EditText et_remark;
	Button btn_save;
	Button btn_return;

	int privacy;
	// 头像按钮
	ImageButton imageButton;
	// 图像选择的视图
	View imageChooseView;
	// 头像选择对话框
	AlertDialog imageChooseDialog;
	// 头像的Gallery
	Gallery gallery;
	// 头像的ImageSwitcher
	ImageSwitcher is;
	// 用于记录当前选中图像在图像数组中的位置
	int currentImagePosition;
	// 用于记录上一次图片的位置
	int previousImagePosition;
	// 判断头像有没有变化
	boolean imageChanged;
	/******
	 * 所有的图像图片
	 * 
	 ****/
	private int[] images = new int[] { R.drawable.icon, R.drawable.image1,
			R.drawable.image2, R.drawable.image3, R.drawable.image4,
			R.drawable.image5, R.drawable.image6, R.drawable.image7,
			R.drawable.image8, R.drawable.image9, R.drawable.image10 };

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.addnewcontacts);
		Intent intent = getIntent();
		// 先确定好保密类型
		if (intent.getExtras() != null
				&& intent.getExtras().getInt("privacy") == 1) {
			privacy = 1;
		} else {
			privacy = 0;
		}

		// 实例化组件
		et_name = (EditText) findViewById(R.id.username);
		et_mobilePhone = (EditText) findViewById(R.id.mobilephone);
		et_officePhone = (EditText) findViewById(R.id.officephone);
		et_familyPhone = (EditText) findViewById(R.id.familyphone);
		et_position = (EditText) findViewById(R.id.position);
		et_company = (EditText) findViewById(R.id.company);
		et_address = (EditText) findViewById(R.id.address);
		et_zipCode = (EditText) findViewById(R.id.zipcode);
		et_otherContact = (EditText) findViewById(R.id.othercontact);
		et_email = (EditText) findViewById(R.id.email);
		et_remark = (EditText) findViewById(R.id.remark);

		btn_save = (Button) findViewById(R.id.save);
		btn_return = (Button) findViewById(R.id.btn_return);
		imageButton = (ImageButton) findViewById(R.id.image_button);

		/*****
		 * 保存按钮的监听事件
		 */
		btn_save.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 判断姓名是否为空
				String name = et_name.getText().toString();
				if (name.trim().equals("")) {
					Toast.makeText(AddNewContacts.this, "姓名不许为空",
							Toast.LENGTH_LONG).show();
					return;
				}
				// 从表单上获取数据
				UserInfo user = new UserInfo();
				user.username = name;
				user.address = et_address.getText().toString();
				user.company = et_company.getText().toString();
				user.email = et_email.getText().toString();
				user.familyPhone = et_familyPhone.getText().toString();
				user.mobilePhone = et_mobilePhone.getText().toString();
				user.officePhone = et_officePhone.getText().toString();
				user.otherContact = et_otherContact.getText().toString();
				user.position = et_position.getText().toString();
				user.remark = et_remark.getText().toString();
				user.zipCode = et_zipCode.getText().toString();
				// 判断头像是否改变,若改变,则用当前的位置,若没有改变,则用前一回的位置
				if (imageChanged) {
					user.imageId = images[currentImagePosition % images.length];
				} else {
					user.imageId = images[previousImagePosition % images.length];
				}
				user.privacy = privacy;
				// 创建数据库帮助类
				DBHelper helper = new DBHelper(AddNewContacts.this);
				// 打开数据库
				helper.openDatabase();
				// 把user存储到数据库里
				long result = helper.insert(user);

				// 通过结果来判断是否插入成功,若为1,则表示插入数据失败
				if (result == -1) {
					Toast.makeText(AddNewContacts.this, "添加失败",
							Toast.LENGTH_LONG);
				}
				setTitle("用户添加成功!");
				// 返回到上一个Activity,也就是Main.activity
				setResult(3);
				// 销毁当前视图
				finish();
			}

		});

		/**
		 * 
		 * f返回按钮的监听事件
		 * **/
		btn_return.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		/***
		 * 图片按钮 的监听事件
		 * 
		 * **/

		imageButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 为gallery装载图片 调用下面的loadImage的方法
				loadImage();
				// 初始化imageChooseDialog
				initImageChooseDialog();
				imageChooseDialog.show();
			}
		});

	}

	/*****
	 * 图片按钮的装载方法实现选择图片的功能
	 * 
	 * **/
	public void loadImage() {
		if (imageChooseView == null) {
			LayoutInflater li = LayoutInflater.from(AddNewContacts.this);
			imageChooseView = li.inflate(R.layout.imageswitch, null);

			// 通过渲染xml文件,得到一个视图(View),再拿到这个View里面的Gallery
			gallery = (Gallery) imageChooseView.findViewById(R.id.gallery);
			// 为Gallery装载图片
			gallery.setAdapter(new ImageAdapter(this));
			// 设置选择的位置为图片的中间位置
			gallery.setSelection(images.length / 2);
			is = (ImageSwitcher) imageChooseView.findViewById(R.id.imageswitch);
			is.setFactory(this);
			// 设置动画效果淡入淡出
			is.setInAnimation(AnimationUtils.loadAnimation(this,
					android.R.anim.fade_in));
			// 卸载图片的动画效果
			is.setOutAnimation(AnimationUtils.loadAnimation(this,
					android.R.anim.fade_out));

			// 为画廊图片设置监听事件
			gallery.setOnItemSelectedListener(new OnItemSelectedListener() {

				@Override
				public void onItemSelected(AdapterView<?> arg0, View arg1,
						int arg2, long arg3) {
					// 当前的头像位置为选中的位置
					currentImagePosition = arg2;
					// 为ImageSwitcher设置图像
					is.setImageResource(images[arg2 % images.length]);

				}

				@Override
				public void onNothingSelected(AdapterView<?> arg0) {

				}
			});
		}

	}

	/**
	 * 自定义Gallery的适配器
	 * 
	 ***/
	class ImageAdapter extends BaseAdapter {

		private Context context;

		public ImageAdapter(Context context) {
			this.context = context;
		}

		@Override
		public int getCount() {
			return Integer.MAX_VALUE;
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		/**
		 * gallery从这个方法中拿到image
		 */
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView iv = new ImageView(context);
			iv.setImageResource(images[position % images.length]);
			iv.setAdjustViewBounds(true);
			iv.setLayoutParams(new Gallery.LayoutParams(80, 80));
			iv.setPadding(15, 10, 15, 10);
			return iv;

		}

	}

	@Override
	public View makeView() {
		ImageView view = new ImageView(this);
		view.setBackgroundColor(0xff000000);
		// 控制图像应调整大小和移动以匹配这个ImageView的大小 居中
		view.setScaleType(ScaleType.FIT_CENTER);
		// 设置图片的大小为 90 * 90
		view.setLayoutParams(new ImageSwitcher.LayoutParams(90, 90));
		return view;
	}

	public void initImageChooseDialog() {
		if (imageChooseDialog == null) {
			// 选择图片的对话框
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setTitle("请选择图像")

			.setView(imageChooseView).setPositiveButton("确定",
					new DialogInterface.OnClickListener() {

						// 确定按钮的监听事件
						public void onClick(DialogInterface dialog, int which) {
							imageChanged = true;
							previousImagePosition = currentImagePosition;
							// 设置图片为选择图片的通过位置
							imageButton
									.setImageResource(images[currentImagePosition
											% images.length]);
						}
					}).setNegativeButton("取消",
					new DialogInterface.OnClickListener() {
						// 取消按钮的监听事件
						@Override
						public void onClick(DialogInterface dialog, int which) {
							currentImagePosition = previousImagePosition;

						}
					});
			imageChooseDialog = builder.create();
		}
	}

	/**
	 * 当退出的时候,回收资源
	 */
	@Override
	protected void onDestroy() {
		if (is != null) {
			is = null;
		}
		if (gallery != null) {
			gallery = null;
		}
		if (imageChooseDialog != null) {
			imageChooseDialog = null;
		}
		if (imageChooseView != null) {
			imageChooseView = null;
		}
		if (imageButton != null) {
			imageButton = null;
		}

		super.onDestroy();
	}
}


14.接着是后台数据库的支持类DBHelper.java

package com.wang.Db;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import com.wang.UserInfo.UserInfo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;

public class DBHelper {

	public static final String DB_DBNAME = "Addressphone";

	public static final String DB_TABLENAME = "addressphone";

	public static final int VERSION = 4;

	public static SQLiteDatabase dbInstance;

	private MyDBHelper myDBHelper;

	private StringBuffer tableCreate;

	private Context context;

	public DBHelper(Context context) {
		this.context = context;
	}

	// 打开数据库
	public void openDatabase() {
		if (dbInstance == null) {
			myDBHelper = new MyDBHelper(context, DB_DBNAME, VERSION);
			dbInstance = myDBHelper.getWritableDatabase();
		}
	}

	/**
	 * 往数据库里面的user表插入一条数据,若失败返回-1
	 */
	public long insert(UserInfo user) {
		ContentValues values = new ContentValues();
		values.put("name", user.username);
		values.put("mobilephone", user.mobilePhone);
		values.put("officephone", user.officePhone);
		values.put("familyphone", user.familyPhone);
		values.put("address", user.address);
		values.put("othercontact", user.otherContact);
		values.put("email", user.email);
		values.put("position", user.position);
		values.put("company", user.company);
		values.put("zipcode", user.zipCode);
		values.put("remark", user.remark);
		values.put("imageid", user.imageId);
		values.put("privacy", user.privacy);
		return dbInstance.insert(DB_TABLENAME, null, values);
	}

	/**
	 * 获得数据库中所有的用户,将每一个用户放到一个map中去,然后再将map放到list里面去返回
	 */

	public ArrayList getAllUser(boolean privacy) {
		ArrayList list = new ArrayList();
		Cursor cursor = null;
		if (privacy) {
			cursor = dbInstance.query(DB_TABLENAME, new String[] { "_id",
					"name", "mobilephone", "officephone", "familyphone",
					"address", "othercontact", "email", "position", "company",
					"zipcode", "remark", "imageid" },

			"privacy=1", null, null, null, null);
		} else {
			cursor = dbInstance.query(DB_TABLENAME, new String[] { "_id",
					"name", "mobilephone", "officephone", "familyphone",
					"address", "othercontact", "email", "position", "company",
					"zipcode", "remark", "imageid" }, "privacy=0", null, null,
					null, null);
		}

		while (cursor.moveToNext()) {
			HashMap item = new HashMap();
			item.put("_id", cursor.getInt(cursor.getColumnIndex("_id")));
			item.put("name", cursor.getString(cursor.getColumnIndex("name")));
			item.put("mobilephone", cursor.getString(cursor
					.getColumnIndex("mobilephone")));
			item.put("officephone", cursor.getString(cursor
					.getColumnIndex("officephone")));
			item.put("familyphone", cursor.getString(cursor
					.getColumnIndex("familyphone")));
			item.put("address", cursor.getString(cursor
					.getColumnIndex("address")));
			item.put("othercontact", cursor.getString(cursor
					.getColumnIndex("othercontact")));
			item.put("email", cursor.getString(cursor.getColumnIndex("email")));
			item.put("position", cursor.getString(cursor
					.getColumnIndex("position")));
			item.put("company", cursor.getString(cursor
					.getColumnIndex("company")));
			item.put("zipcode", cursor.getString(cursor
					.getColumnIndex("zipcode")));
			item.put("remark", cursor
					.getString(cursor.getColumnIndex("remark")));
			item
					.put("imageid", cursor.getInt(cursor
							.getColumnIndex("imageid")));
			list.add(item);
		}

		return list;
	}

	/**
	 * 删除数据库表中的某条信息
	 * **/
	public void delete(int _id) {
		dbInstance.delete(DB_TABLENAME, "_id=?", new String[] { String
				.valueOf(_id) });
	}

	/**
	 * 删除数据库表中的所有信息
	 * **/
	public void deleteAll(int privacy) {
		dbInstance.delete(DB_TABLENAME, "privacy=?", new String[] { String
				.valueOf(privacy) });
	}

	/**
	 * 得到数据库表中的总的条目数
	 * **/
	public int getTotalCount() {
		Cursor cursor = dbInstance.query(DB_TABLENAME,
				new String[] { "count(*)" }, null, null, null, null, null);
		cursor.moveToNext();
		return cursor.getInt(0);
	}

	/**
	 * 得到联系人的信息
	 * **/
	//
	public ArrayList getUsers(String condition, boolean privacy) {
		ArrayList list = new ArrayList();
		String strSelection = "";
		if (privacy) {
			strSelection = "and privacy = 1";
		} else {
			strSelection = "and privacy = 0";
		}
		// 模糊查询
		String sql = "select * from " + DB_TABLENAME
				+ " where 1=1 and (name like '%" + condition + "%' "
				+ "or mobilephone like '%" + condition
				+ "%' or familyphone like '%" + condition + "%' "
				+ "or officephone like '%" + condition + "%')" + strSelection;
		Cursor cursor = dbInstance.rawQuery(sql, null);
		while (cursor.moveToNext()) {
			HashMap item = new HashMap();
			item.put("_id", cursor.getInt(cursor.getColumnIndex("_id")));
			item.put("name", cursor.getString(cursor.getColumnIndex("name")));
			item.put("mobilephone", cursor.getString(cursor
					.getColumnIndex("mobilephone")));
			item.put("officephone", cursor.getString(cursor
					.getColumnIndex("officephone")));
			item.put("familyphone", cursor.getString(cursor
					.getColumnIndex("familyphone")));
			item.put("address", cursor.getString(cursor
					.getColumnIndex("address")));
			item.put("othercontact", cursor.getString(cursor
					.getColumnIndex("othercontact")));
			item.put("email", cursor.getString(cursor.getColumnIndex("email")));
			item.put("position", cursor.getString(cursor
					.getColumnIndex("position")));
			item.put("company", cursor.getString(cursor
					.getColumnIndex("company")));
			item.put("zipcode", cursor.getString(cursor
					.getColumnIndex("zipcode")));
			item.put("remark", cursor
					.getString(cursor.getColumnIndex("remark")));
			item
					.put("imageid", cursor.getInt(cursor
							.getColumnIndex("imageid")));
			list.add(item);
		}
		return list;
	}

	/**
	 * 删除标记
	 * **/
	public void deleteMarked(ArrayList<Integer> deleteId) {
		StringBuffer strDeleteId = new StringBuffer();
		strDeleteId.append("_id=");
		for (int i = 0; i < deleteId.size(); i++) {
			if (i != deleteId.size() - 1) {
				strDeleteId.append(deleteId.get(i) + " or _id=");
			} else {
				strDeleteId.append(deleteId.get(i));
			}

		}
		dbInstance.delete(DB_TABLENAME, strDeleteId.toString(), null);
		System.out.println(strDeleteId.toString());

	}

	/**
	 * 备份数据
	 * **/
	//
	public void backupData(boolean privacy) {
		StringBuffer sqlBackup = new StringBuffer();
		Cursor cursor = null;
		if (privacy) {
			cursor = dbInstance.query(DB_TABLENAME, new String[] { "_id",
					"name", "mobilephone", "officephone", "familyphone",
					"address", "othercontact", "email", "position", "company",
					"zipcode", "remark", "imageid,privacy" }, "privacy=1",
					null, null, null, null);
		} else {
			cursor = dbInstance.query(DB_TABLENAME, new String[] { "_id",
					"name", "mobilephone", "officephone", "familyphone",
					"address", "othercontact", "email", "position", "company",
					"zipcode", "remark", "imageid,privacy" }, "privacy=0",
					null, null, null, null);
		}

		while (cursor.moveToNext()) {
			sqlBackup
					.append(
							"insert into "
									+ DB_TABLENAME
									+ "(name,mobilephone,officephone,familyphone,address,othercontact,email,position,company,zipcode,remark,imageid,privacy)")
					.append(" values ('")
					.append(cursor.getString(cursor.getColumnIndex("name")))
					.append("','")
					.append(
							cursor.getString(cursor
									.getColumnIndex("mobilephone")))
					.append("','")
					.append(
							cursor.getString(cursor
									.getColumnIndex("officephone")))
					.append("','")
					.append(
							cursor.getString(cursor
									.getColumnIndex("familyphone")))
					.append("','")
					.append(cursor.getString(cursor.getColumnIndex("address")))
					.append("','")
					.append(
							cursor.getString(cursor
									.getColumnIndex("othercontact")))
					.append("','")
					.append(cursor.getString(cursor.getColumnIndex("email")))
					.append("','")
					.append(cursor.getString(cursor.getColumnIndex("position")))
					.append("','").append(
							cursor.getString(cursor.getColumnIndex("company")))
					.append("','").append(
							cursor.getString(cursor.getColumnIndex("zipcode")))
					.append("','").append(
							cursor.getString(cursor.getColumnIndex("remark")))
					.append("',").append(
							cursor.getInt(cursor.getColumnIndex("imageid")))
					.append(",").append(
							cursor.getInt(cursor.getColumnIndex("privacy")))
					.append(");").append("\n");
		}
		saveDataToFile(sqlBackup.toString(), privacy);

	}

	/**
	 * 保存数据到文件中
	 * **/
	private void saveDataToFile(String strData, boolean privacy) {
		String fileName = "";
		if (privacy) {
			fileName = "priv_data.bk";
		} else {
			fileName = "comm_data.bk";
		}
		try {
			String SDPATH = Environment.getExternalStorageDirectory() + "/";
			File fileParentPath = new File(SDPATH + "zpContactData/");
			fileParentPath.mkdirs();
			File file = new File(SDPATH + "zpContactData/" + fileName);
			System.out.println("the file previous path = "
					+ file.getAbsolutePath());

			file.createNewFile();
			System.out
					.println("the file next path = " + file.getAbsolutePath());
			FileOutputStream fos = new FileOutputStream(file);

			fos.write(strData.getBytes());
			fos.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 恢复备份数据方法
	 * **/
	//
	public void restoreData(String fileName) {
		try {
			String SDPATH = Environment.getExternalStorageDirectory() + "/";
			File file = null;
			if (fileName.endsWith(".bk")) {
				file = new File(SDPATH + "zpContactData/" + fileName);
			} else {
				file = new File(SDPATH + "zpContactData/" + fileName + ".bk");
			}
			BufferedReader br = new BufferedReader(new FileReader(file));
			String str = "";
			while ((str = br.readLine()) != null) {
				System.out.println(str);
				dbInstance.execSQL(str);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 查找备份的文件
	 * **/
	public boolean findFile(String fileName) {
		String SDPATH = Environment.getExternalStorageDirectory() + "/";
		File file = null;
		if (fileName.endsWith(".bk")) {
			file = new File(SDPATH + "zpContact/" + fileName);
		} else {
			file = new File(SDPATH + "zpContact/" + fileName + ".bk");
		}

		if (file.exists()) {
			return true;
		} else {
			return false;
		}

	}

	/**
	 * 创建一个打开数据库的方法
	 * **/
	class MyDBHelper extends SQLiteOpenHelper {

		public MyDBHelper(Context context, String name, int version) {
			super(context, name, null, version);
		}

		// 创建数据库
		public void onCreate(SQLiteDatabase db) {
			tableCreate = new StringBuffer();
			// 创建表
			tableCreate.append("create table ").append(DB_TABLENAME).append(
					" (").append("_id integer primary key autoincrement,")
					.append("name text,").append("mobilephone text,").append(
							"officephone text,").append("familyphone text,")
					.append("address text,").append("othercontact text,")
					.append("email text,").append("position text,").append(
							"company text,").append("zipcode text,").append(
							"remark text,").append("imageid int,").append(
							"privacy int ").append(")");
			System.out.println(tableCreate.toString());
			// 执行创建语句
			db.execSQL(tableCreate.toString());
		}

		// 数据库时需要升级删除表,在重新创建
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			String sql = "drop table if exists " + DB_TABLENAME;
			db.execSQL(sql);
			myDBHelper.onCreate(db);
		}

	}

}

15.然后呢,就是用户信息的类UserInfo.java

package com.wang.UserInfo;

import java.io.Serializable;

public class UserInfo implements Serializable{

	
	public int _id;
	
	public String username;
	
	public String mobilePhone;
	
	public String officePhone;
	
	public String familyPhone;
	
	public String position;
	
	public String company;
	
	public String address;
	
	public String zipCode;
	
	public String email;
	
	public String otherContact;
	
	public String remark;
	
	public int imageId;
	
	public int privacy;//1代表隐私用户  0代表普通用户
	
	
	
	
	


}

16.亲,最后别忘了添加权限和注册Activity哦!!

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wang.Activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".startAnimation"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".AddressPhoneBookDemoActivity" />
        <activity android:name=".AddNewContacts" />
    </application>

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

</manifest>
17.然后就可以看到运行结果喽!!运行结果如下:

 解释一下,第一张的欢迎界面,                                           第二张是跳转的的主界面                                                        第三张的点击item拨打联系人电话的界面

                     第四张的增加联系人的界面                               第五张的选择联系人头像的界面                                            第六张是查找联系人的界面

                      第七张是删除一条已标记的联系人的界面      第八张是管理联系人的界面                                                    第九张的删除所有联系人的界面

                      第十张是调用系统拨号功能的界面                   第十一张是备份数据的界面                                                   第十二章是备份完成的界面


android 通讯录的兑现android 通讯录的兑现android 通讯录的兑现android 通讯录的兑现android 通讯录的兑现android 通讯录的兑现android 通讯录的兑现android 通讯录的兑现android 通讯录的兑现android 通讯录的兑现


android 通讯录的兑现android 通讯录的兑现