1、expandlistview
2. 数据库操作
3、头像剪辑等
(在F:\java\c联系人发送短信等操作\ContactsManager)
package com.android.contactsmanager.dao; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Date; import java.util.Random; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.graphics.Bitmap; import android.util.Log; import com.android.contactsmanager.bean.MyContacts; public class ContactsManagerDbAdater { public static final String TAG="ContactsManagerDbAdater"; public static final String DATABASE_NAME="contactsmanager.db"; public static final int DATABASE_VERSON=3; public static final String TABLE_CONTACTS="contacts"; public static final String TABLE_GROUPS="groups"; public static final String TABLECONTACTS= "create table contacts("+ "_id INTEGER PRIMARY KEY,"+//rowID "name TEXT NOT NULL,"+ //姓名 "contactIcon BLOB,"+ //联系人图标 "telPhone TEXT NOT NULL,"+ //电话号码 "groupName TEXT,"+ //所属组名 "birthday TEXT,"+ //生日 "address TEXT,"+ //地址 "email TEXT NOT NULL,"+ //邮箱 "description TEXT NOT NULL,"+ //好友描述 "createTime TEXT,"+ //创建时间 "modifyTime TEXT"+ //修改时间 ");"; public static final String TABLEGROUPS= "create table groups("+ "_id INTEGER PRIMARY KEY,"+ //rowId "groupName TEXT UNIQUE NOT NULL,"+ //组名 "createTime TEXT,"+ //创建时间 "modifyTime TEXT"+ //修改时间 ");"; private Context context; private DatabaseHelper dbHelper; private SQLiteDatabase mSQLiteDatabase = null; public ContactsManagerDbAdater(Context context){ this.context=context; } public void open(){ dbHelper=new DatabaseHelper(context); mSQLiteDatabase=dbHelper.getWritableDatabase(); } public void close(){ dbHelper.close(); System.out.println(">>>>>>>>>>>>>>>>>>>>>> CLOSE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"); } private static class DatabaseHelper extends SQLiteOpenHelper{ public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSON); } @Override public void onCreate(SQLiteDatabase db) { Log.i("TAG", "create table start..."); db.execSQL(TABLECONTACTS); db.execSQL(TABLEGROUPS); //创建临时的组 String tempGroups[]={"亲人","朋友","同学","同事","android开发组","老乡","篮球俱乐部"}; for(int i=0;i<tempGroups.length;i++){ String sql="insert into groups values(?,?,null,null)"; Object[] bindArgs={i+1,tempGroups[i]}; db.execSQL(sql,bindArgs); } String tempName[]={ "android", "google", "windows mobile", "microsoft", "symbian", "nokia", "bada", "sumsung", "IBM", "QQ" }; Random random=new Random(); int index=0; //创建临时的联系人 for(int i=0;i<10;i++){ String sql="insert into contacts values(?,?,null,'15927614509',?,'1986-11-03','杭州','lhb@163.com',?,null,null)"; index=random.nextInt(tempGroups.length); Object[] bindArgs={i+1,tempName[i],tempGroups[index],"this is a scroll text,you can move cursor to here move it..."}; db.execSQL(sql, bindArgs); } Log.i("TAG", "create table over..."); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i("TAG", "contactsmanager.db Upgrade..."); db.execSQL("DROP TABLE IF EXISTS "+TABLE_CONTACTS); db.execSQL("DROP TABLE IF EXISTS "+TABLE_GROUPS); onCreate(db); } } //将头像转换成byte[]以便能将图片存到数据库 public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutputStream out=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); try { out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "transform byte exception"); } return out.toByteArray(); } //table contacts public static final String contacts_id="_id"; public static final String contacts_icon="contactIcon"; public static final String contacts_name="name"; public static final String contacts_description="description"; public static final String contacts_telPhone="telPhone"; public static final String contacts_email="email"; String contactProjection[]={ contacts_id, contacts_icon, contacts_name, contacts_description, contacts_telPhone, contacts_email }; //table groups public static final String groups_id="_id"; public static final String groups_groupName="groupName"; String groupsProjection[]={ groups_id, groups_groupName }; //查找所有组 public Cursor getAllGroups(){ return mSQLiteDatabase.query( TABLE_GROUPS, groupsProjection, null, null, null, null, null); } //得到给定组的所有成员 public Cursor getContactsByGroupName(String groupName){ return mSQLiteDatabase.query( TABLE_CONTACTS, contactProjection, "groupName='"+groupName+"'", null, null, null, null); } //统计给定组的人数 public int getCountContactByGroupName(String groupName){ int count=0; String sql="select count(*) from contacts where groupName='"+groupName+"'"; Cursor cursor=mSQLiteDatabase.rawQuery(sql, null); if(cursor.moveToFirst()){ count=cursor.getInt(0); } cursor.close(); return count; } //同步更新contacts里groupName字段信息 public void updateSyncData(String sql,Object[] Args){ mSQLiteDatabase.execSQL(sql, Args); } //查询联系人在哪个组 public String checkContactGroup(String sql,String selectionArgs[]){ String groupName=""; Cursor cursor=mSQLiteDatabase.rawQuery(sql, selectionArgs); if(cursor.moveToFirst()){ groupName=cursor.getString(0); } cursor.close(); return groupName; } //查询 public Cursor getCursorBySql(String sql,String selectionArgs[]){ return mSQLiteDatabase.rawQuery(sql, selectionArgs); } //添加一个组 public long inserDataToGroups(String groupName){ String formatTime=getSysNowTime(); ContentValues content=new ContentValues(); content.put(groups_groupName, groupName); content.put("createTime", formatTime); content.put("modifyTime", formatTime); return mSQLiteDatabase.insert(TABLE_GROUPS, null, content); } //删除一个组 public int deleteDataFromGroups(String groupName){ return mSQLiteDatabase.delete(TABLE_GROUPS, "groupName='"+groupName+"'", null); } //更新一个组 public int updateDataToGroups(String newgroupName,String oldgroupName){ String formatTime=getSysNowTime(); ContentValues content=new ContentValues(); content.put(groups_groupName, newgroupName); content.put("modifyTime", formatTime); return mSQLiteDatabase.update(TABLE_GROUPS, content, "groupName='"+oldgroupName+"'", null); } //添加一个联系人 public long inserDataToContacts(MyContacts contactInfo){ String formatTime=getSysNowTime(); ContentValues content=new ContentValues(); content.put("name", contactInfo.getName()); content.put("birthday", contactInfo.getBirthday()); content.put("address", contactInfo.getAddress()); content.put("telPhone", contactInfo.getTelPhone()); content.put("email", contactInfo.getEmail()); content.put("contactIcon", contactInfo.getContactIcon()); content.put("description", contactInfo.getDescription()); content.put("groupName", contactInfo.getGroupName()); content.put("createTime", formatTime); content.put("modifyTime", formatTime); return mSQLiteDatabase.insert(TABLE_CONTACTS, null, content); } //删除一个联系人 public int deleteDataFromContacts(String name){ return mSQLiteDatabase.delete(TABLE_CONTACTS, "name='"+name+"'", null); } //更新联系人 /** * * contactInfo:用户重新编辑的联系人信息 * name:编辑的是哪个联系人 */ public int updateDataToContacts(MyContacts contactInfo,String name){ String formatTime=getSysNowTime(); ContentValues content=new ContentValues(); content.put("name", contactInfo.getName()); content.put("birthday", contactInfo.getBirthday()); content.put("address", contactInfo.getAddress()); content.put("telPhone", contactInfo.getTelPhone()); content.put("email", contactInfo.getEmail()); content.put("contactIcon", contactInfo.getContactIcon()); content.put("description", contactInfo.getDescription()); content.put("groupName", contactInfo.getGroupName()); content.put("modifyTime", formatTime); System.out.println("update success"); System.out.println(name); return mSQLiteDatabase.update(TABLE_CONTACTS, content, "name=?", new String[]{name}); } //get sysTime public String getSysNowTime(){ Date now=new Date(); java.text.DateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:MM:ss"); String formatTime=format.format(now); return formatTime; } }
package com.android.contactsmanager; import java.util.Random; import android.app.AlertDialog; import android.app.Dialog; import android.app.ExpandableListActivity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.ContextMenu.ContextMenuInfo; import android.widget.Button; import android.widget.CursorTreeAdapter; import android.widget.EditText; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.Toast; import android.widget.ExpandableListView.ExpandableListContextMenuInfo; import com.android.contactsmanager.bean.MyConstant; import com.android.contactsmanager.dao.ContactsManagerDbAdater; public class ContactsManager extends ExpandableListActivity { public static final String TAG="ContactsManager"; private ContactsManagerDbAdater contactsManagerDbAdapter; int groupNameIndex; private MyCursrTreeAdapter myCursorTreeAdapter; View view; PopupWindow pop; Button btnSms; Button btnEmail; Button btnCall; //缓存除了所选联系人所在组的所有组,用在移动联系人上 String groups[]; //缓存用户所在的组,用在移动联系人上 String mygroupName; //长按分组上的 菜单 public static final int MENU_GROUP_ADD=Menu.FIRST; public static final int MENU_GROUP_DELETE=Menu.FIRST+1; public static final int MENU_GROUP_MODIFY=Menu.FIRST+2; public static final int MENU_GROUP_ADDCONTACT=Menu.FIRST+3; //长按联系人菜单 public static final int MENU_CONTACTS_DELETE=Menu.FIRST; public static final int MENU_CONTACTS_MODIFY=Menu.FIRST+1; public static final int MENU_CONTACTS_MOVE=Menu.FIRST+2; //联系人各个字段索引 private static final int icon_index=1; private static final int name_index=2; private static final int description_index=3; private static final int telPhone_index=4; private static final int email_index=5; //组上groupName字段索引 private static final int groupName_index=1; Cursor groupCursor; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); getExpandableListView().setBackgroundResource(R.drawable.default_bg); registerForContextMenu(getExpandableListView()); contactsManagerDbAdapter=new ContactsManagerDbAdater(this); contactsManagerDbAdapter.open(); initMyAdapter(); initPopupWindow(); getExpandableListView().setCacheColorHint(0);//拖动时避免出现黑色 getExpandableListView().setDivider(null);//去掉每项下面的黑线(分割线) //自定义下拉图标 getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.expander_ic_folder)); } private void initPopupWindow() { view = this.getLayoutInflater().inflate(R.layout.popup_window, null); pop = new PopupWindow(view, ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); pop.setOutsideTouchable(true); btnSms=(Button)view.findViewById(R.id.btnSms); btnEmail=(Button)view.findViewById(R.id.btnEmail); btnCall=(Button)view.findViewById(R.id.btnCall); } //给适配器赋值,刷新界面的时候也会用到 public void initMyAdapter(){ groupCursor=contactsManagerDbAdapter.getAllGroups(); startManagingCursor(groupCursor); //get the groupName column index groupNameIndex=groupCursor.getColumnIndexOrThrow("groupName"); //set my adapter myCursorTreeAdapter=new MyCursrTreeAdapter( groupCursor, this, true ); setListAdapter(myCursorTreeAdapter); } public class MyCursrTreeAdapter extends CursorTreeAdapter { public MyCursrTreeAdapter(Cursor cursor, Context context, boolean autoRequery) { super(cursor, context, autoRequery); } @Override protected void bindGroupView(View view, Context context, Cursor cursor, boolean isExpanded) { // TODO Auto-generated method stub Log.v(TAG, "bindGroupView"); TextView groupName=(TextView)view.findViewById(R.id.groupName); String group=cursor.getString(groupName_index); groupName.setText(group); TextView groupCount=(TextView)view.findViewById(R.id.groupCount); int count=contactsManagerDbAdapter.getCountContactByGroupName(group); groupCount.setText("["+count+"]"); } @Override protected View newGroupView(Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) { Log.v(TAG, "newGroupView"); LayoutInflater inflate=LayoutInflater.from(ContactsManager.this); View view=inflate.inflate(R.layout.grouplayout, null); bindGroupView(view, context, cursor, isExpanded); return view; } @Override protected Cursor getChildrenCursor(Cursor groupCursor) { Log.v(TAG, "getChildrenCursor"); String groupName=groupCursor.getString(groupName_index);//得到当前的组名 Cursor childCursor=contactsManagerDbAdapter.getContactsByGroupName(groupName); startManagingCursor(childCursor); return childCursor; } @Override protected View newChildView(Context context, Cursor cursor, boolean isLastChild, ViewGroup parent) { Log.v(TAG, "newChildView"); LayoutInflater inflate=LayoutInflater.from(ContactsManager.this); View view=inflate.inflate(R.layout.childlayout, null); bindChildView(view, context, cursor, isLastChild); return view; } @Override protected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) { // TODO Auto-generated method stub Log.v(TAG, "bindChildView"); ImageView contactIcon=(ImageView)view.findViewById(R.id.contactIcon); contactIcon.setImageBitmap(getBitmapFromByte(cursor.getBlob(icon_index))); TextView name=(TextView)view.findViewById(R.id.name); name.setText(cursor.getString(name_index)); TextView description=(TextView)view.findViewById(R.id.description); description.setTextKeepState(cursor.getString(description_index)); final String phoneNumber=cursor.getString(telPhone_index); final String email=cursor.getString(email_index); ImageView mycursor=(ImageView)view.findViewById(R.id.myCursor); mycursor.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //showToast("点击了图片"); if(pop.isShowing()) { pop.dismiss(); } else { pop.showAsDropDown(v); btnSms.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { pop.dismiss(); Uri uri=Uri.parse("smsto:"+phoneNumber); Intent it = new Intent(Intent.ACTION_SENDTO, uri); it.putExtra("sms_body", "呵呵!好久不见"); startActivity(it); } }); btnEmail.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { pop.dismiss(); Uri uri = Uri.parse("mailto:"+email); Intent it = new Intent(Intent.ACTION_SENDTO, uri); startActivity(it); } }); btnCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { pop.dismiss(); Uri uri = Uri.parse("tel:"+phoneNumber); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity(it); } }); } } }); } } //得到存储在数据库中的头像 public Bitmap getBitmapFromByte(byte[] temp){ if(temp!=null){ Bitmap bitmap=BitmapFactory.decodeByteArray(temp, 0, temp.length); return bitmap; }else{ return getRandomIcon(); } } //得到随机图片 public Bitmap getRandomIcon(){ Integer allIcon[]={ R.drawable.h001, R.drawable.h002, R.drawable.h003, R.drawable.h004, R.drawable.h005, R.drawable.h006, R.drawable.h007, R.drawable.h008, R.drawable.h009, R.drawable.h010, R.drawable.h011, R.drawable.h012, R.drawable.h013, R.drawable.h014, R.drawable.h015, R.drawable.h016, R.drawable.h017, R.drawable.h018, R.drawable.h019, R.drawable.h020, }; Random random=new Random(); int index=random.nextInt(20); Resources res=getResources(); Bitmap bmp=BitmapFactory.decodeResource(res,allIcon[index]); return bmp; } //弹出提示信息 public void showToast(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { ExpandableListContextMenuInfo info=(ExpandableListContextMenuInfo)menuInfo; int type = ExpandableListView.getPackedPositionType(info.packedPosition); if(type == ExpandableListView.PACKED_POSITION_TYPE_GROUP){//在组上长按 String title=((TextView)info.targetView.findViewById(R.id.groupName)).getText().toString(); menu.setHeaderTitle(title); menu.add(0, MENU_GROUP_ADD, 0, "添加分组"); menu.add(0, MENU_GROUP_DELETE, 0, "删除分组"); menu.add(0, MENU_GROUP_MODIFY, 0, "重命名"); menu.add(0, MENU_GROUP_ADDCONTACT, 0, "添加联系人"); }else if(type == ExpandableListView.PACKED_POSITION_TYPE_CHILD){//在联系人上长按 String title=((TextView)info.targetView.findViewById(R.id.name)).getText().toString(); Drawable icon=((ImageView)info.targetView.findViewById(R.id.contactIcon)).getDrawable(); menu.setHeaderTitle(title); menu.setHeaderIcon(icon); menu.add(0, MENU_CONTACTS_DELETE, 0, "删除联系人"); menu.add(0, MENU_CONTACTS_MODIFY, 0, "编辑联系人"); menu.add(0, MENU_CONTACTS_MOVE, 0, "移动联系人到..."); } } public boolean onContextItemSelected(MenuItem item) { ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo(); int type = ExpandableListView.getPackedPositionType(info.packedPosition); if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { final String name=((TextView)info.targetView.findViewById(R.id.name)).getText().toString(); switch(item.getItemId()){ case MENU_CONTACTS_DELETE :{ AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setTitle("确定要删除联系人吗?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { contactsManagerDbAdapter.deleteDataFromContacts(name); initMyAdapter(); showToast("删除成功"); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); break; } case MENU_CONTACTS_MODIFY :{ Intent intent=new Intent(); intent.putExtra("name", name); intent.setAction(Intent.ACTION_EDIT); intent.setDataAndType(Uri.parse(MyConstant.CONTENT_URI), MyConstant.CONTENT_TYPE_EDIT); startActivity(intent); break; } case MENU_CONTACTS_MOVE : createMoveContactDialog(name).show(); break; } return true; } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) { String groupName=((TextView)info.targetView.findViewById(R.id.groupName)).getText().toString(); System.out.println(groupName); switch(item.getItemId()){ case MENU_GROUP_ADD : createDialog("addGroup",groupName).show(); break; case MENU_GROUP_DELETE : createDialog("deleteGroup",groupName).show(); break; case MENU_GROUP_MODIFY : createDialog("modifyGroup",groupName).show(); break; case MENU_GROUP_ADDCONTACT :{ Intent intent=new Intent(); intent.setAction(Intent.ACTION_INSERT); intent.setDataAndType(Uri.parse(MyConstant.CONTENT_URI), MyConstant.CONTENT_TYPE_INSERT); startActivity(intent); break; } } return true; } return false; } private Dialog createMoveContactDialog(final String name){ AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setTitle("移动联系人到..."); builder.setSingleChoiceItems(getSpecAllGroup(name), -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //得到用户要移动到的组 String newgroupName=groups[which]; String sql="update contacts set groupName=? where groupName=? and name=?"; Object[] Args={newgroupName,mygroupName,name}; contactsManagerDbAdapter.updateSyncData(sql, Args); initMyAdapter(); showToast("成功移动联系人到"+newgroupName); dialog.dismiss(); } }); return builder.create(); } private String[] getSpecAllGroup(String name){ String sql="select groupName from contacts where name=?"; String selectionArgs[]={name}; mygroupName=contactsManagerDbAdapter.checkContactGroup(sql, selectionArgs); Cursor cursor=contactsManagerDbAdapter.getAllGroups(); int count=cursor.getCount()-1; groups=new String[count]; int i=0; while(cursor.moveToNext()){ String newgroupName=cursor.getString(1); if(!newgroupName.equals(mygroupName)){ groups[i]=newgroupName; i++; } } cursor.close(); return groups; } private Dialog createDialog(String msg,final String groupName) { AlertDialog.Builder builder=new AlertDialog.Builder(this); if(msg.equals("addGroup")){ final EditText content=new EditText(this); builder.setTitle("添加组"); builder.setView(content); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //添加新的组到数据库 String groupName=content.getText().toString().trim(); Cursor cursor=contactsManagerDbAdapter.getAllGroups(); if(!groupName.equals("")){ while(cursor.moveToNext()){ if(cursor.getString(1).equals(groupName)){ showToast(groupName+"已存在!"); return; } } contactsManagerDbAdapter.inserDataToGroups(groupName); initMyAdapter(); showToast("添加成功"); System.out.println(">>>>>>>>>>>>>>add>>>>>>>>>>>>>>>>>>>>>>>>"); } } }); builder.setNeutralButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); return builder.create(); } if(msg.equals("deleteGroup")){ builder.setTitle("确定要删除该组和该组内的所有联系人吗?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { contactsManagerDbAdapter.deleteDataFromGroups(groupName); String sql="delete from contacts where groupName=?"; Object Args[]={groupName}; contactsManagerDbAdapter.updateSyncData(sql, Args); initMyAdapter(); showToast("删除成功"); System.out.println(">>>>>>>>>>>>>>>delete>>>>>>>>>>>>>>>>>>>>>"); } }); builder.setNeutralButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); return builder.create(); } if(msg.equals("modifyGroup")){ final EditText content=new EditText(this); content.setText(groupName); builder.setTitle("请输入新的组名"); builder.setView(content); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String newgroupName=content.getText().toString().trim(); Cursor cursor=contactsManagerDbAdapter.getAllGroups(); if(!newgroupName.equals("")){ while(cursor.moveToNext()){ if(cursor.getString(1).equals(newgroupName)){ if(!newgroupName.equals(groupName)){ showToast(newgroupName+"已存在"); return; }else{ return; } } } contactsManagerDbAdapter.updateDataToGroups(newgroupName, groupName); String sql="update contacts set groupName=? where groupName=?"; Object Args[]={newgroupName,groupName}; contactsManagerDbAdapter.updateSyncData(sql, Args); initMyAdapter(); showToast("修改成功"); System.out.println(">>>>>>>>>>>>>>>update>>>>>>>>>>>>>>>>>>>>>"); } } }); builder.setNeutralButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); return builder.create(); } return null; } //处理键盘事件 public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode == KeyEvent.KEYCODE_BACK ){ AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setTitle("提示"); builder.setMessage("确定要退出程序?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); finish(); } }); builder.setNeutralButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }); builder.show(); return true; }else{ return super.onKeyDown(keyCode, event); } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if(contactsManagerDbAdapter!=null){ contactsManagerDbAdapter.close(); contactsManagerDbAdapter=null; } } }
package com.android.contactsmanager; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.ContextThemeWrapper; import android.view.KeyEvent; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.ListAdapter; import android.widget.Spinner; import android.widget.Toast; import android.widget.AdapterView.OnItemSelectedListener; import com.android.contactsmanager.bean.MyContacts; import com.android.contactsmanager.dao.ContactsManagerDbAdater; import com.android.contactsmanager.ui.PhotoEditorView; public class EditContact extends Activity { ContactsManagerDbAdater contactsManagerDbAdapter; public static final String TAG = "EditContact"; // 用来标识请求照相功能的activity private static final int CAMERA_WITH_DATA = 3023; // 用来标识请求gallery的activity private static final int PHOTO_PICKED_WITH_DATA = 3021; // 拍照的照片存储位置 private static final File PHOTO_DIR = new File(Environment .getExternalStorageDirectory() + "/DCIM/Camera"); private File mCurrentPhotoFile;//照相机拍照得到的图片 private PhotoEditorView mEditor;//头像 Cursor contactInfoCursor;//联系人信息 MyContacts contactAllInfoCache=null;//缓存联系人所有信息 ArrayAdapter<String> adapter;//缓存GroupSpinner数据 //各个组件 private EditText name;//姓名 private EditText phoneNumber;//号码 private Spinner groupSpinner;//组 private Button birthdayButton;//生日 private EditText address;//住址 private EditText email;//邮箱 private EditText information;//好友描述 private Button ok;//确定 private Button cancel;//取消 //用户所有信息 String _name; byte[] img;//头像数据 String _phoneNumber; String _groupSpinner; String _birthdayButton; String _address; String _email; String _information; //联系人信息的索引值 int index_name=1; int index_contactIcon=2; int index_telePhone=3; int index_groupName=4; int index_birthday=5; int index_address=6; int index_email=7; int index_description=8; //int selectedGroupNameIndex;//记录用户选择的组的索引,从新的activity返回时用到 //activity处于两种状态,插入状态或者编辑状态 private static final int STATE_INSERT=0;//插入状态 private static final int STATE_EDIT=1;//编辑状态 private int state;//记录当前的状态 // 生日,年,月,日 private int mYear; private int mMonth; private int mDay; String editContactName;//缓存要编辑的联系人 @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Log.v(TAG,"onCreate"); setContentView(R.layout.editcontact); contactsManagerDbAdapter=new ContactsManagerDbAdater(this); contactsManagerDbAdapter.open(); initAllComponents();//初始化所有组件 initGroupSpinnerData(); Intent intent=getIntent(); String action=intent.getAction(); if(action.equals(Intent.ACTION_INSERT)){ state=STATE_INSERT; }else if(action.equals(Intent.ACTION_EDIT)){ state=STATE_EDIT; //下面就该取数据库里面的数据了 editContactName=intent.getStringExtra("name"); String sql="select * from contacts where name=?"; String selectionArgs[]={editContactName}; System.out.println(editContactName); contactInfoCursor=contactsManagerDbAdapter.getCursorBySql(sql, selectionArgs); startManagingCursor(contactInfoCursor); //不知道为何只有加了下面的if语句到resume方法后才会正常执行 if(contactInfoCursor!=null && contactInfoCursor.getCount()>0){ System.out.println("<<<<<<<<<<<<<<<< test >>>>>>>>>>>>>>>>>>>"); } }else{ Log.e(TAG, "Unknown action,program will exit..."); finish(); return; } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); if(state == STATE_INSERT){ setTitle("新建联系人"); getNowTime(); String birthday=mYear+"-"+mMonth+"-"+mDay; birthdayButton.setText(birthday); }else if(state == STATE_EDIT){ setTitle("编辑联系人"); if(contactInfoCursor!=null && contactInfoCursor.getCount()>0){ System.out.println(">>>>>>>>>>>>>>>>>> gogogogo >>>>>>>>>>>>>>>>>>"); if(contactAllInfoCache==null){ contactInfoCursor.moveToFirst(); //得到数据库中的联系人信息 _name=contactInfoCursor.getString(1); img=contactInfoCursor.getBlob(2); _phoneNumber=contactInfoCursor.getString(3); _groupSpinner=contactInfoCursor.getString(4); _birthdayButton=contactInfoCursor.getString(5); System.out.println(_birthdayButton); initDateFromDb(_birthdayButton); _address=contactInfoCursor.getString(6); _email=contactInfoCursor.getString(7); _information=contactInfoCursor.getString(8); }else{ _name=contactAllInfoCache.getName(); //img已经在onActivityResult方法内赋了新值,这里再调用contactAllInfoCache的getContactIcon //方法会把img给覆盖掉,所以就不再调用了 //img=contactAllInfoCache.getContactIcon(); _phoneNumber=contactAllInfoCache.getTelPhone(); _groupSpinner=contactAllInfoCache.getGroupName(); _birthdayButton=contactAllInfoCache.getBirthday(); _address=contactAllInfoCache.getAddress(); _email=contactAllInfoCache.getEmail(); _information=contactAllInfoCache.getDescription(); } name.setText(_name); mEditor.setPhotoBitmap(getBitmapFromByte(img)); phoneNumber.setText(_phoneNumber); int groupIndex=adapter.getPosition(_groupSpinner); groupSpinner.setSelection(groupIndex); birthdayButton.setText(_birthdayButton); address.setText(_address); email.setText(_email); information.setTextKeepState(_information); System.out.println(">>>>>>>>>>>>>>>>>> end >>>>>>>>>>>>>>>>>>"); } } } private void initDateFromDb(String birthdayButton2) { System.out.println(birthdayButton2); String args[]=birthdayButton2.split("-"); System.out.println(args.length); mYear = Integer.valueOf(args[0]); mMonth = Integer.valueOf(args[1]); mDay = Integer.valueOf(args[2]); } //当从当前的Activity切换到另一个Activity时调用,切换过去时当前Activity并未结束(Destory) protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); Log.v(TAG, "record original data"); //缓存联系人信息 contactAllInfoCache=new MyContacts(); //得到最终用户信息 contactAllInfoCache.setName(name.getText().toString()); BitmapDrawable bd=(BitmapDrawable)mEditor.getDrawable(); Bitmap bitMap=bd.getBitmap(); contactAllInfoCache.setContactIcon(getBitmapByte(bitMap)); contactAllInfoCache.setTelPhone(phoneNumber.getText().toString()); contactAllInfoCache.setGroupName(groupSpinner.getSelectedItem().toString()); contactAllInfoCache.setBirthday(birthdayButton.getText().toString()); contactAllInfoCache.setAddress(address.getText().toString()); contactAllInfoCache.setEmail(email.getText().toString()); contactAllInfoCache.setDescription(information.getText().toString()); outState.putSerializable("originalData", contactAllInfoCache); } //初始化Spinner数据 public void initGroupSpinnerData(){ adapter=new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, getAllExistGroup() ); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); groupSpinner.setAdapter(adapter); } //得到所有的组 public ArrayList<String> getAllExistGroup(){ Cursor cursor=contactsManagerDbAdapter.getAllGroups(); ArrayList<String> groups=new ArrayList<String>(); if(cursor!=null){ while(cursor.moveToNext()){ groups.add(cursor.getString(cursor.getColumnIndexOrThrow("groupName"))); } } cursor.close(); return groups; } //得到系统时间 private void getNowTime() { Calendar time = Calendar.getInstance(); mYear = time.get(Calendar.YEAR); mMonth = time.get(Calendar.MONTH)+1; mDay = time.get(Calendar.DAY_OF_MONTH); } private void initAllComponents() { name=(EditText)findViewById(R.id.name); mEditor=(PhotoEditorView)findViewById(R.id.icon); phoneNumber=(EditText)findViewById(R.id.phoneNumber); groupSpinner=(Spinner)findViewById(R.id.spinner_group); birthdayButton=(Button)findViewById(R.id.birthdayButtonPicker); address=(EditText)findViewById(R.id.address); email=(EditText)findViewById(R.id.email); information=(EditText)findViewById(R.id.information); ok=(Button)findViewById(R.id.btn_ok); cancel=(Button)findViewById(R.id.btn_cancel); setComponentsListener(); } private void setComponentsListener() { //图像上的监听 mEditor.setEditorListener(new PhotoListener()); //组上的监听,注意在这之前还要给spinner赋值,别忘了 groupSpinner.setOnItemSelectedListener(new OnItemSelectedListener(){ @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { _groupSpinner=adapter.getItem(position).toString();//得到用户选择的组 //selectedGroupNameIndex=position;//记录下用户选择的组的索引 parent.setVisibility(View.VISIBLE); } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } }); //生日按钮监听 birthdayButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { createTimePickerDialog().show(); } }); //ok监听 ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub verifyAllData(); } }); //cancel监听 cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } protected void verifyAllData() { // 得到所有信息 _name=name.getText().toString().trim(); BitmapDrawable bd=(BitmapDrawable)mEditor.getDrawable(); Bitmap bitMap=bd.getBitmap(); img=getBitmapByte(bitMap); _phoneNumber=phoneNumber.getText().toString().trim(); _groupSpinner=groupSpinner.getSelectedItem().toString(); _birthdayButton=birthdayButton.getText().toString(); _address=address.getText().toString().trim(); _email=email.getText().toString().trim(); _information=information.getText().toString().trim(); //检查数据的有效性 if(_name.equals("") || _name==null){ showToast("名字不能为空"); return; } if(_phoneNumber.equals("") || _name==null){ showToast("号码 不能为空"); return; } if(_email.equals("")){ showToast("邮箱不能为空"); return; } if(!isEmail(_email)){ showToast("Email格式有误"); return; } if(_information.equals("")){ showToast("好友描述不能为空"); return; } contactAllInfoCache=new MyContacts(); //得到最终用户信息 contactAllInfoCache.setName(_name); contactAllInfoCache.setContactIcon(img); contactAllInfoCache.setTelPhone(_phoneNumber); contactAllInfoCache.setGroupName(_groupSpinner); contactAllInfoCache.setBirthday(_birthdayButton); contactAllInfoCache.setAddress(_address); contactAllInfoCache.setEmail(_email); contactAllInfoCache.setDescription(_information); if(state == STATE_INSERT){ long count=contactsManagerDbAdapter.inserDataToContacts(contactAllInfoCache); if(count>0){ showToast("新建联系人成功"); finish(); }else{ showToast("新建联系人失败"); finish(); } }else{ System.out.println(editContactName); int count=contactsManagerDbAdapter.updateDataToContacts(contactAllInfoCache, editContactName); System.out.println(count); if(count>0){ showToast("联系人更新成功"); finish(); }else{ showToast("联系人更新失败"); finish(); } } } public Boolean isEmail(String str){ String regex="[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-Z0-9]-*){1,}\\.){1,3}[a-zA-Z\\-]{1,}"; return match(regex, str); } public Boolean match(String regex,String str){ Pattern pattern=Pattern.compile(regex); Matcher matcher=pattern.matcher(str); return matcher.matches(); } //处理键盘事件 public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode == KeyEvent.KEYCODE_BACK ){ AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setTitle("提示"); builder.setMessage("确定要退出程序?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); finish(); } }); builder.setNeutralButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }); builder.show(); return true; }else{ return super.onKeyDown(keyCode, event); } } //创建DatePickerDialog protected Dialog createTimePickerDialog() { return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay); } //DatePickerDialog上的监听 private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { mYear = year; mMonth = monthOfYear; mDay = dayOfMonth; updateToDisplay(); } }; //更新时间 private void updateToDisplay() { birthdayButton.setText( new StringBuilder() .append(mYear).append("-") .append(mMonth + 1).append("-") .append(mDay)); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if(contactsManagerDbAdapter!=null){ contactsManagerDbAdapter.close(); contactsManagerDbAdapter=null; } } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); } //将头像转换成byte[]以便能将图片存到数据库 public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutputStream out=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); try { out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "transform byte exception"); } return out.toByteArray(); } //得到存储在数据库中的头像 public Bitmap getBitmapFromByte(byte[] temp){ if(temp!=null){ Bitmap bitmap=BitmapFactory.decodeByteArray(temp, 0, temp.length); return bitmap; }else{ //Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.contact_add_icon); return null; } } //弹出提示信息 public void showToast(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } public class PhotoListener implements PhotoEditorView.EditorListener, DialogInterface.OnClickListener { @Override public void onRequest(int request) { if (request == PhotoEditorView.REQUEST_PICK_PHOTO) { if (mEditor.hasSetPhoto()) { // 当前已经有了照片 createPhotoDialog().show(); }else{ doPickPhotoAction(); } } } private Dialog createPhotoDialog() { Context context = EditContact.this; final Context dialogContext = new ContextThemeWrapper(context, android.R.style.Theme_Light); String cancel="返回"; String[] choices; choices = new String[3]; choices[0] = getString(R.string.use_photo_as_primary); choices[1] = getString(R.string.removePicture); choices[2] = getString(R.string.changePicture); final ListAdapter adapter = new ArrayAdapter<String>(dialogContext, android.R.layout.simple_list_item_1, choices); final AlertDialog.Builder builder = new AlertDialog.Builder( dialogContext); builder.setTitle(R.string.attachToContact); builder.setSingleChoiceItems(adapter, -1, this); builder.setNegativeButton(cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); return builder.create(); } @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); switch (which) { case 0: break;// 什么也不做 case 1: // 删除图像 mEditor.setPhotoBitmap(null); break; case 2: // 替换图像 doPickPhotoAction(); break; } } private void doPickPhotoAction() { Context context = EditContact.this; // Wrap our context to inflate list items using correct theme final Context dialogContext = new ContextThemeWrapper(context, android.R.style.Theme_Light); String cancel="返回"; String[] choices; choices = new String[2]; choices[0] = getString(R.string.take_photo); choices[1] = getString(R.string.pick_photo); final ListAdapter adapter = new ArrayAdapter<String>(dialogContext, android.R.layout.simple_list_item_1, choices); final AlertDialog.Builder builder = new AlertDialog.Builder( dialogContext); builder.setTitle(R.string.attachToContact); builder.setSingleChoiceItems(adapter, -1, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); switch (which) { case 0:{ String status=Environment.getExternalStorageState(); if(status.equals(Environment.MEDIA_MOUNTED)){//判断是否有SD卡 doTakePhoto();// 用户点击了从照相机获取 } else{ showToast("没有SD卡"); } break; } case 1: doPickPhotoFromGallery();// 从相册中去获取 break; } } }); builder.setNegativeButton(cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } } /** * 拍照获取图片 * */ protected void doTakePhoto() { try { // Launch camera to take photo for selected contact PHOTO_DIR.mkdirs();// 创建照片的存储目录 mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName());// 给新照的照片文件命名 final Intent intent = getTakePickIntent(mCurrentPhotoFile); startActivityForResult(intent, CAMERA_WITH_DATA); } catch (ActivityNotFoundException e) { Toast.makeText(this, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); } } public static Intent getTakePickIntent(File f) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); return intent; } /** * 用当前时间给取得的图片命名 * */ private String getPhotoFileName() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat( "'IMG'_yyyy-MM-dd HH:mm:ss"); return dateFormat.format(date) + ".jpg"; } // 请求Gallery程序 protected void doPickPhotoFromGallery() { try { // Launch picker to choose photo for selected contact final Intent intent = getPhotoPickIntent(); startActivityForResult(intent, PHOTO_PICKED_WITH_DATA); } catch (ActivityNotFoundException e) { Toast.makeText(this, R.string.photoPickerNotFoundText1, Toast.LENGTH_LONG).show(); } } // 封装请求Gallery的intent public static Intent getPhotoPickIntent() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); intent.setType("image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 80); intent.putExtra("outputY", 80); intent.putExtra("return-data", true); return intent; } // 因为调用了Camera和Gally所以要判断他们各自的返回情况,他们启动时是这样的startActivityForResult protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) return; switch (requestCode) { case PHOTO_PICKED_WITH_DATA: {// 调用Gallery返回的 final Bitmap photo = data.getParcelableExtra("data"); // 下面就是显示照片了 System.out.println(photo); //缓存用户选择的图片 img=getBitmapByte(photo); Log.v(TAG, "new photo set!"); mEditor.setPhotoBitmap(photo); System.out.println("set new photo"); break; } case CAMERA_WITH_DATA: {// 照相机程序返回的,再次调用图片剪辑程序去修剪图片 doCropPhoto(mCurrentPhotoFile); break; } } } protected void doCropPhoto(File f) { try {// f 是照相机拍下的照片 // 本来这里是要把相机拍下的照片放到媒体库里面的,可是当前的SDK1.5版本不支持下面的方法 // MediaScannerConnection.scanFile( // this, // new String[] { f.getAbsolutePath() }, // new String[] { null }, // null); // Launch gallery to crop the photo // 启动gallery去剪辑这个照片 final Intent intent = getCropImageIntent(Uri.fromFile(f)); startActivityForResult(intent, PHOTO_PICKED_WITH_DATA); } catch (Exception e) { Log.e(TAG, "Cannot crop image", e); Toast.makeText(this, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); } } /** * Constructs an intent for image cropping. 调用图片剪辑程序 */ public static Intent getCropImageIntent(Uri photoUri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(photoUri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 80); intent.putExtra("outputY", 80); intent.putExtra("return-data", true); return intent; } }