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
阅读全文
0 0
- Android通讯录(可上传照片)
- android 拍照上传照片
- android 拍照上传照片
- android 拍照上传照片
- android 拍照上传照片
- Android 照片上传
- android 拍照上传照片
- android 拍照上传照片
- android 拍照上传照片
- android 拍照上传照片
- android 拍照上传照片
- Android 新漏洞利用代码(可悄悄地拍下并上传照片)
- android照相及照片上传
- android照相及照片上传
- android照相及照片上传
- android照相及照片上传
- android 拍照上传照片(新)
- android 拍照上传照片(新)
- 百练2757:最长上升子序列
- Jenkins Publish Over SSH 远程自动发布
- 2011金山杯ACM/ICPC程序设计大赛珠海区域赛ACM/ICPC排名
- 如何在linux服务器上部署多个tomcat服务
- centos安装php扩展swoole及简单使用
- Android通讯录(可上传照片)
- hdu3336Count the string(KMP的next[]数组的应用+KMP模板)
- 深度学习第二章-线性代数笔记
- DataGridComboBoxColumn绑定后显示空白的问题
- fabric源码解析8——peer的System Chaincode
- 总线设备驱动模型
- JAVA使用POI操作word文档实例,兼容doc,docx
- 基于SSM的RBAC权限系统(4)-巧用Shiro自带加密
- 第一次配置java环境变量