这是一个简单的通讯录,它具有对联系人的增删改查,以及呼叫功能。
它有如下几个难点:拍照以及从图库选择图片上传。数据库存取图片。活动间传递图片数据。长按多选删除。
拍照及从图库上传照片,通过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