732003684

导航

向下展开列表的项处理和发送邮件短信

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;
    }
}

 

posted on 2013-03-10 17:10  732003684  阅读(830)  评论(0编辑  收藏  举报