Android通讯录(可上传照片)

来源:互联网 发布:旋转矩阵计算旋转角度 编辑:程序博客网 时间:2024/05/17 05:15

这是一个简单的通讯录,它具有对联系人的增删改查,以及呼叫功能。

它有如下几个难点:拍照以及从图库选择图片上传。数据库存取图片。活动间传递图片数据。长按多选删除。

拍照及从图库上传照片,通过intent跳转,startActivityForResult   获取图片资源。这里应当注意的是,不同的机型对拍照还有图库操作所返回的东西不一样,然后就是有些手机需要你在设置里面手动给权限。

 //imagebutton选择图片        img.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                final Mdialog mdialog=new Mdialog(context);                mdialog.setTitle("选择照片");                mdialog.show();                //调用拍照               mdialog.button1.setOnClickListener(new View.OnClickListener() {                   @Override                   public void onClick(View v) {                       Intent carmeintent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                       startActivityForResult(carmeintent,1);                       mdialog.dismiss();                   }               });                //调用图库选择照片                mdialog.button2.setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View v) {                        Intent photointent=new Intent(Intent.ACTION_PICK);                        photointent.setType("image/*");                        startActivityForResult(photointent,2);                        mdialog.dismiss();                    }                });            }        });
 @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        switch (requestCode) {            case 1:                if(resultCode==RESULT_OK)                {                    //不同机器获取照片的方式不一样,有点通过uri,有点直接在bundle的data中。                    Uri uri=data.getData();                    if(uri==null){                        Bundle bundle=data.getExtras();                        Bitmap bitmap= (Bitmap) bundle.get("data");                        img.setImageBitmap(bitmap);                    }                    else{                        ContentResolver cr=this.getContentResolver();                        try {                            Bitmap bitmap= BitmapFactory.decodeStream(cr.openInputStream(uri));                            img.setImageBitmap(bitmap);                        } catch (FileNotFoundException e) {                            e.printStackTrace();                        }                    }                }                break;            case 2:                if(resultCode==RESULT_OK)                {                    //这里可能部分机型返回的是一个数据库索引,出现问题,可以自行修改                    Uri uri=data.getData();                    ContentResolver cr=this.getContentResolver();                    try {                        Bitmap bitmap= BitmapFactory.decodeStream(cr.openInputStream(uri));                        img.setImageBitmap(bitmap);                    } catch (FileNotFoundException e) {                        e.printStackTrace();                    }                }                break;    }}

数据库存取图片。这里主要就是把图片转化成二进制数组,然后储存,就是一个转化过程。

 //插入    public void insert(Data data){        ContentValues cv=new ContentValues();        //图片转化成二进制数组        Bitmap bitmap=data.bitmap;        ByteArrayOutputStream out=new ByteArrayOutputStream();        bitmap.compress(Bitmap.CompressFormat.PNG,100,out);        byte[] picture=out.toByteArray();        cv.put("picture",picture);        cv.put("name",data.name);        cv.put("number",data.number);        db.insert("phone",null,cv);    }    //查找    public LinkedList<Data> find(){        LinkedList<Data> datas=new LinkedList<Data>();        Cursor cu=db.rawQuery("select * from phone",null);        while (cu.moveToNext()==true){            //二进制数组转化成图片            byte[] p=cu.getBlob(cu.getColumnIndex("picture"));            Bitmap bitmap= BitmapFactory.decodeByteArray(p,0,p.length,null);                        String name=cu.getString(cu.getColumnIndex("name"));            String number=cu.getString(cu.getColumnIndex("number"));            datas.add(new Data(bitmap,name,number));        }        cu.close();        return datas;    }

活动间传递图片资源。虽然Bitmap是被序列了的。可以直接传,但是intent传递数据的大小有限制,直接传一般会出错。所以这里采用了静态变量来传
public class TransBitmap {    /*bitmap对象虽然是可序列化的。但是intent传输对象有大小限制。最大40k,超过则会出现    E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!     所以这里建议使用单列模式*/    private static Bitmap bitmap=null;    public static Bitmap getBitmap(){        return bitmap;    }    public static void setBitmap(Bitmap bt){        bitmap=bt;    }


长按多选删除。这里涉及一个就是长按显示checkbox和删除,然后就是点击删除,根据checkbox的状态来删除相应的item
package com.example.caremausers;import android.graphics.Bitmap;/** * Created by 雷华平 on 2017/7/23. */public class Data {    public Bitmap bitmap;    public String name;    public String number;    public boolean isshow;    public boolean ischecked;    public Data(){}    public Data(Bitmap bitmap,String name,String number){        this.bitmap=bitmap;        this.name=name;        this.number=number;        this.isshow=false;        this.ischecked=false;    }}
viewHoder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {            @Override            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                //复选框被选中时,让标志复选框选中状态的变量设为true                if(isChecked)                    datas.get(position).ischecked=true;                else                    datas.get(position).ischecked=false;            }        });        viewHoder.checkBox.setChecked(datas.get(position).ischecked);        //根据item中标志是否显示复选框来决定是否显示        if(datas.get(position).isshow)            viewHoder.checkBox.setVisibility(View.VISIBLE);        else            viewHoder.checkBox.setVisibility(View.GONE);
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {            @Override            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {                for(int i=0;i<myAdapter.getCount();i++){                    Data data= (Data) myAdapter.getItem(i);                    data.isshow=true;                    myAdapter.modify(i,data);                }                cancel.setVisibility(View.VISIBLE);                delete.setVisibility(View.VISIBLE);                needcancel=true;                return true;            }        });        //删除的时候如果直接一次循环遍历,删除某一项后,他后面每一项都i都-1。        //所以要做适当的处理        delete.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                int k=myAdapter.getCount();                int i=0;                while(true){                    Data data=(Data)myAdapter.getItem(i);                    if(data.ischecked) {                        mSql.delete(data.number);                        datas.remove(i);                        k--;                    }else{                        i++;                    }                    if(i==k) break;                }                myAdapter.notifyDataSetChanged();            }        });

完整项目已经上传,有需要可以下载。
网址: http://download.csdn.net/detail/lhp15575865420/9911078


原创粉丝点击