Android 图片获取及上传
来源:互联网 发布:python解析字符串re 编辑:程序博客网 时间:2024/04/28 00:50
一、实现逻辑与思路
在Android中实现图片上传,有两种途径:本地上传,照相上传。
在整体框架中,需要实现,打开两种图片上传的方式,然后是接受获取到的图片,并做基本的展示。在主页面中,实现2个Button,用于跳转获取图片的触发事件。在底下实现GridView,用于接受获取到的图片。
图片可上传,当然也可去除选中的图片。为每个Item实现长按事件,从而展示删除按钮,实现对图片的管理。
1,本地上传
应用Button跳转事件,展示本地所有的图片列表。根据选中事件,跳转展示图片列表对应的图片详情。当前图片展示页面只用于展示图片,对图片进行了缩放。添加图片被选中框,能够管理图片是否被选中状态。
整个过程实现了主页面---图片列表页面--图片展示详情页面,点击完成,图片需要被传回主页面。当前采用广播的模式将选中的图片信息,传回主页面。同时,主页面需要有广播接收器,接受回传的图片信息。
需要加载本地图片文件列表,获取全部图片地址的方法。
为实现图片的压缩,需要获取图片原有大小。
抽取图片处理相关方法:
public class Util { Context context; public Util(Context context) { this.context = context; } /** * 获取全部图片地址 * * @return */ public ArrayList<String> listAlldir() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Uri uri = intent.getData(); ArrayList<String> list = new ArrayList<String>(); String[] proj = {MediaStore.Images.Media.DATA}; Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);//managedQuery(uri, proj, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String path = cursor.getString(0); list.add(new File(path).getAbsolutePath()); } } return list; } /** * 本地图片文件列表 * @return */ public List<FileTraversal> LocalImgFileList() { List<FileTraversal> data = new ArrayList<FileTraversal>(); String filename = ""; List<String> allimglist = listAlldir(); List<String> retulist = new ArrayList<String>(); if (allimglist != null) { Set set = new TreeSet(); String[] str; for (int i = 0; i < allimglist.size(); i++) { retulist.add(getfileinfo(allimglist.get(i))); } for (int i = 0; i < retulist.size(); i++) { set.add(retulist.get(i)); } str = (String[]) set.toArray(new String[0]); for(int i = 0; i < str.length; i++) { filename = str[i]; FileTraversal ftl = new FileTraversal(); ftl.filename = filename; data.add(ftl); } for (int i = 0; i < data.size(); i++) { for (int j = 0; j < allimglist.size(); j++) { if (data.get(i).filename.equals(getfileinfo(allimglist.get(j)))) { data.get(i).filecontent.add(allimglist.get(j)); } } } } return data; } //显示原生图片尺寸大小 public Bitmap getPathBitmap(Uri imageFilePath, int dw, int dh) throws FileNotFoundException { //获取屏幕的宽和高 /** * 为了计算缩放的比例,我们需要获取整个图片的尺寸,而不是图片 * BitmapFactory.Options类中有一个布尔型变量inJustDecodeBounds,将其设置为true * 这样,我们获取到的就是图片的尺寸,而不用加载图片了。 * 当我们设置这个值的时候,我们接着就可以从BitmapFactory.Options的outWidth和outHeight中获取到值 */ BitmapFactory.Options op = new BitmapFactory.Options(); op.inJustDecodeBounds = true; //由于使用了MediaStore存储,这里根据URI获取输入流的形式 Bitmap pic = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(imageFilePath), null, op); int wRatio = (int) Math.ceil(op.outWidth / (float) dw); //计算宽度比例 int hRatio = (int) Math.ceil(op.outHeight / (float) dh); //计算高度比例 /** * 接下来,我们就需要判断是否需要缩放以及到底对宽还是高进行缩放。 * 如果高和宽不是全都超出了屏幕,那么无需缩放。 * 如果高和宽都超出了屏幕大小,则如何选择缩放呢》 * 这需要判断wRatio和hRatio的大小 * 大的一个将被缩放,因为缩放大的时,小的应该自动进行同比率缩放。 * 缩放使用的还是inSampleSize变量 */ if (wRatio > 1 && hRatio > 1) { if (wRatio > hRatio) { op.inSampleSize = wRatio; } else { op.inSampleSize = hRatio; } } op.inJustDecodeBounds = false; //注意这里,一定要设置为false,因为上面我们将其设置为true来获取图片尺寸了 pic = BitmapFactory.decodeStream(context.getContentResolver() .openInputStream(imageFilePath), null, op); return pic; } /** * 获取文件信息 * @param data * @return */ public String getfileinfo(String data) { String filename[] = data.split("/"); if (filename != null) { return filename[filename.length - 2]; } return null; } public void imgExcute(ImageView imageView, ImgCallBack icb, String... params) { LoadBitAsynk loadBitAsynk = new LoadBitAsynk(imageView, icb); loadBitAsynk.execute(params); } /** * 异步加载图片信息 */ public class LoadBitAsynk extends AsyncTask<String, Integer, Bitmap> { ImageView imageView; ImgCallBack icb; LoadBitAsynk(ImageView imageView, ImgCallBack icb) { this.imageView = imageView; this.icb = icb; } @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; try { if (params != null) { for (int i = 0; i < params.length; i++) { bitmap = getPathBitmap(Uri.fromFile(new File(params[i])), 200, 200); } } } catch (FileNotFoundException e) { e.printStackTrace(); } return bitmap; } @Override protected void onPostExecute(Bitmap result) { super.onPostExecute(result); if (result != null) { icb.resultImgCall(imageView, result); } } }}本地加载图片效果:
2,照相上传
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 2);调用系统照相方法即可实现。
注意整体权限添加。
二、注意说明
1,两种展示数据的方式不同:
本地上传应用广播回传,照片上传使用:startActivityForResult。
2,上传图片需要对图片进行压缩、加密:
常用方法是将图片编码为base64。
/** * 获取base64字符串[ 上传图片前将所有图片编码成为base64字符串,然后以一个参数的方式上传图片 ] * * @return */ protected String getImageFiles16() { StringBuilder builder = new StringBuilder(); try { for (BitmapDrawable drawable : bitmaps) { builder.append(BitmapUtil.bitmaptoString(drawable.getBitmap())); builder.append("|"); } if (builder.length() != 0) { builder.deleteCharAt(builder.length() - 1); } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } return builder.toString(); }获取到base64的图片内容,使用String的模式上传数据即可。
生活总是让我们遍体鳞伤,但到后来,那些受伤的地方一定会变成我们最强壮的地方.
0 0
- Android 图片获取及上传
- android 图片获取裁剪上传
- 获取本地图片路径及上传
- 图片上传 预览 及 获取base64
- Android获取本地图片或拍照上传
- Android获取图片、裁剪、压缩、上传头像
- android 调用相机 相册 及图片上传
- Android-图片的上传及加载
- android最新的选择图片及上传
- Android 获取本地图片&图片上传至服务端
- android上传图片及下载图片并显示
- android选取本地图片及关于图片压缩上传问题
- android 获取相册图片及路径
- Android 远程图片获取及本地缓存
- Android获取图片缓存及清除
- 图片上传获取本地图片
- android从本地媒体库获取图片上传至服务器保存
- 有关asp.net获取android端上传的图片问题
- 水平居中设置-行内元素
- 世上没有哪一种成功,不是有备而来
- 最大流、最小费用最大流
- java web学习路线
- python list列表排序的两种方法及实例讲解
- Android 图片获取及上传
- 实时编程
- Swift专栏:第二章 Swift基础语法(一)
- C++学习笔记之八 复合类型---指针、数组和指针运算
- GetLastError返回值查询
- iOS 指纹识别
- Android与iPhone应用程序界面布局对比
- UILabel设置删除线(电商商品价格)
- Android中的进程与线程