Android实现图片上传功能

最近在开发中,涉及到用户的意见反馈功能这一方面的开发,需要用户输入的文字或者提交的图片,效果大概类似于微信朋友圈那样的图片选择器,一开始自己找了个用universal-image-loader框架写的,很容实现,但是容易出现内存溢出,并且不好解决,是在没办法,就自己看了一些资料,准备自己写;在这里说下本人实现的思路,进入页面也就是显示选择图片的页面用GridView来实现,点击添加图标的时候,用Dialog实现,给Dialog添加相应的动画就可以了,进入图片展示页面还是用GridView来实现,点击所有图片时用的是Dialog和listview来实现的,以下是相应的代码实现:

private void showDialog() { View view = getLayoutInflater().inflate(R.layout.user_header_dialog, null); final Dialog dialog = new Dialog(this, R.style.transparentFrameWindowStyle); dialog.setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); Window window = dialog.getWindow(); // 设置显示动画 window.setWindowAnimations(R.style.main_menu_animstyle); WindowManager.LayoutParams wl = window.getAttributes(); wl.x = 0; wl.y = getWindowManager().getDefaultDisplay().getHeight(); // 以下这两句是为了保证按钮可以水平满屏 wl.width = ViewGroup.LayoutParams.MATCH_PARENT; wl.height = ViewGroup.LayoutParams.WRAP_CONTENT; // 设置显示位置 dialog.onWindowAttributesChanged(wl); // 设置点击外围解散 dialog.setCanceledOnTouchOutside(true); dialog.show(); btn_picture = (Button) window.findViewById(R.id.btn_picture); btn_photo = (Button) window.findViewById(R.id.btn_photo); btn_cancle = (Button) window.findViewById(R.id.btn_cancle); btn_picture.setOnClickListener(new View.OnClickListener() {// 图库 @SuppressLint("InlinedApi") @Override public void onClick(View v) { Intent intent = new Intent(PhotoSelectActivity.this, AlbumActivity.class); startActivity(intent); dialog.dismiss(); } }); btn_photo.setOnClickListener(new View.OnClickListener() {// 相机 @SuppressLint("InlinedApi") @Override public void onClick(View v) { photo(); dialog.dismiss(); } }); btn_cancle.setOnClickListener(new View.OnClickListener() {// 取消 @Override public void onClick(View v) { dialog.dismiss(); } }); }

这是弹框部分的代码,在这里需要注意的就是android6.0系统调用的时候特别是相机和访问sd权限的问题,跟android6.0以下的系统是不一样的,android6.0以下的系统在AndroidManifest.xml文件中配置就可以了,android6.0及6.0以上的话不仅需要再AndroidManifest.xml中声明还需要动态申请权限,如未申请权限就会造成程序的闪退,这里的话没有对android6.0及6.0以上做适配,关于android6.0及6.0以上系统权限的话,会在之后博文中提到;

protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case TAKE_PICTURE: if (Bimp.tempSelectBitmap.size() < 9 && resultCode == RESULT_OK) { File file = new File(Environment.getExternalStorageDirectory() + "/" + mImageFileName); mImagePath = file.getPath(); Bitmap bitmapFromUrl = FileUtils.getBitmapFromUrl(mImagePath, 320, 480); String[] split = mImagePath.split("0/"); String strUrl = ""; if (split != null && split.length > 0) { strUrl = split[1]; } // 重新缓存图片 FileUtils.setPicToView(PhotoSelectActivity.this,bitmapFromUrl, strUrl); // 获取重新缓存图片的大小 File iconDir = FileUtils.getIconDir(PhotoSelectActivity.this); String absolutePath = iconDir.getAbsolutePath(); String picPath = absolutePath + strUrl; ImageItem takePhoto = new ImageItem(); takePhoto.setBitmap(bitmapFromUrl); takePhoto.setImagePath(picPath); Bimp.tempSelectBitmap.add(takePhoto); } break; } }

这里是调用相机拍照返回时调用这里,获取到图片同时对图片进行压缩处理,同时缓存在sd中,并获取相应的路径;

/** * 清空图片集合 */ private void cleanImageList() { Bimp.max = 0; Bimp.tempSelectBitmap.clear(); }

在点击返回或者物理物理返回键的的时候要对定义的静态变量赋值为0,同时清空图片保存时定义的静态list集合;

private void initPow() { View view = getLayoutInflater().inflate(R.layout.listview_popupwindows, null); final Dialog dialog = new Dialog(this, R.style.Dialog_Fullscreen); dialog.setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); Window window = dialog.getWindow(); // 设置显示动画 window.setWindowAnimations(R.style.main_menu_animstyle); WindowManager.LayoutParams wl = window.getAttributes(); wl.x = 0; wl.y = getWindowManager().getDefaultDisplay().getHeight(); int height = 0; int h=(int) (mScreenHeight / 1.6); int listH=AlbumActivity.contentList.size()*DensityUtil.dip2px(AlbumActivity.this,80); if (listH==0) { height=h; }else{ if (listH>h) { height=h; }else{ height=listH; } } // 以下这两句是为了保证按钮可以水平满屏 wl.width = ViewGroup.LayoutParams.MATCH_PARENT; wl.height = height; // 设置显示位置 dialog.onWindowAttributesChanged(wl); // 设置点击外围解散 dialog.setCanceledOnTouchOutside(true); dialog.show(); ListView listview = (ListView) window.findViewById(R.id.listview); ListAdapter listAdapter = new ListAdapter(AlbumActivity.this); listview.setAdapter(listAdapter); listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { dataList = (ArrayList<ImageItem>) AlbumActivity.contentList.get(arg2).imageList; String folderName = AlbumActivity.contentList.get(arg2).bucketName; tv_all.setText("" + folderName); gridImageAdapter = new AlbumGridViewAdapter(AlbumActivity.this, dataList, Bimp.tempSelectBitmap); agridView.setAdapter(gridImageAdapter); dialog.dismiss(); } }); }

这里的话是在图片选择展示页面,点击所有图片时的弹框,用的是一个Dialog和listview来实现的,在这里要注意的是就是listview展示的高度问题,这里所限获取到所有listview条目高度和,同时获取到屏幕的高度,如果listview条目高度和大于屏幕高度/1.6时,就采用屏幕高度/1.6,如果listview条目高度和小于屏幕高度/1.6时,就采用listview条目高度;这样就差不多实现了,下面是运行效果:

源码:Androidphoto

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-27 07:05:31

Android实现图片上传功能的相关文章

android实现图片上传功能(springMvc)

本文实例为大家分享了Android图片上传的具体代码,供大家参考,具体内容如下 Android端: String fileName = tvFilename.getText().toString(); RequestBody description = RequestBody.create( okhttp3.MultipartBody.FORM, fileName); File fileImage = new File(saveFileName); RequestBody requestBody

服务器-Android多图片上传会发生覆盖问题

问题描述 Android多图片上传会发生覆盖问题 我写了一个多图片上传的小程序,选出的图片存在List集合里,然后通过for循环发送到服务器里.可是却发生了收到都是最后一张图片,这该怎么解决!求大神相助!!!!!!!!!!!!!!!!!!!! 解决方案 应该是服务器那边的问题,服务器在每个上传的图片都应该保存到不同的文件名上 解决方案二: 服务器那边没处理好... 解决方案三: 访问网络是一个耗时的操作,程序会优先处理UI主线程,执行完for语句之后再跳转到子线程去请求服务器,于是乎...每次都

iOS实现压缩图片上传功能_IOS

本文实例为大家分享了iOS实现压缩图片上传功能,供大家参考,具体内容如下 #pragma mark - 打开相机 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ UIImage *image = info[UIImagePickerControllerOriginalImage]; s

如何用 React 完成图片上传功能?

本文讲的是如何用 React 完成图片上传功能?, 下面这篇特邀文章是由 Damon Bauer 完成的,主题是关于一个 web 开发人员非常常见的工作:为用户提供图片上传功能.我想说这并不容易,但是有了一些功能强大的工具来帮忙做一些比较"重"的工作,这个任务会觉得比以前轻松许多.Damon 甚至全程在浏览器中完成了这项任务! 对于 web 开发者来说,让用户能够上传图片是一件很常见的事情.一开始可能看起来小菜一碟,但是当真正创建一个图片上传组件的时候,还是有些问题需要去考虑的.这里有

c# 客户端 调用 java Webservice 实现图片上传功能

问题描述 c# 客户端 调用 java Webservice 实现图片上传功能 no SOAPAction header c#端添加服务引用 生成实体类 直接调用webservice图片上传方法 结果报错**no SOAPAction header** 解决方案 有没有大神 来帮帮忙 解决方案二: 参考这个:http://blog.csdn.net/wxyong3/article/details/38727503

PHP中Ckeditor+Ckfinder配置图片上传功能

第一:安装配置CKEditor 在扩展CKfinder实现图片上传之前,我们先把最基本的CKeditor编辑器安装一下. 1.  将下载的ckeditor_3.4.2.zip解压,复制目录下的ckeditor文件夹至所需目录,如/admin/. 第一:安装配置CKEditor ,可改/admin/ckeditor/ckeditor.js来配置编辑器,如字体.背景色.语言 .界面高宽.编辑器按钮分布等  代码如下 复制代码 config.language = 'en'; config.skin =

Android将图片上传到php服务器的实例代码

layout中很普通,就是两个button和一个ImageView <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height=&q

如何在SAE上使用Ueditor图片上传功能

SAE上是没有目录读写权限的,所以要在SAE使用Ueditor的图片上传功能需要借助SAE的Storage服务. 一.开通Storage服务 在SAE控制台开通Storage服务,并新增一个domain. 二.修改Ueditor代码 Ueditor处理上传文件的方法在DjangoUeditor/jviews.py中,上传图片的请求是由下面函数处理的 #上传附件 @csrf_exempt def UploadFile(request,uploadtype,uploadpath): ''''' 省略

扩展FCKeditor编辑器的图片上传功能

在我使用的个人博客(Mr.d's Time)中,后台的文章发布使用的是FCKeditor编辑器,在FCKeditor编辑器中通过简单的配置就能使用已提 供的图片上传的功能.但没有提供对上传后的图片进行管理,从而无法满足我日后的各种应用场景,比如:使用已上传的文件.删除已上传的 文件等等,以至于在写博时,遇到"在文章中要插入图片"这样的应用让我的操作很繁琐(上传图片---记住文件件 ---手工写Url),因此无 法让我享受到在写博时的快感.从而让我有了扩展FCKeditor编辑器图片上传