Android通讯录(可上传照片)

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

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

拍照及从图库上传照片,通过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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值