查看: 1892|回复: 0

[Android教程] Android实现图片上传功能

发表于 2017-8-6 11:35:39
尚学堂AD

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

  1. private void showDialog() {
  2. View view = getLayoutInflater().inflate(R.layout.user_header_dialog, null);
  3. final Dialog dialog = new Dialog(this, R.style.transparentFrameWindowStyle);
  4. dialog.setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
  5. Window window = dialog.getWindow();
  6. // 设置显示动画
  7. window.setWindowAnimations(R.style.main_menu_animstyle);
  8. WindowManager.LayoutParams wl = window.getAttributes();
  9. wl.x = 0;
  10. wl.y = getWindowManager().getDefaultDisplay().getHeight();
  11. // 以下这两句是为了保证按钮可以水平满屏
  12. wl.width = ViewGroup.LayoutParams.MATCH_PARENT;
  13. wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;
  14. // 设置显示位置
  15. dialog.onWindowAttributesChanged(wl);
  16. // 设置点击外围解散
  17. dialog.setCanceledOnTouchOutside(true);
  18. dialog.show();
  19. btn_picture = (Button) window.findViewById(R.id.btn_picture);
  20. btn_photo = (Button) window.findViewById(R.id.btn_photo);
  21. btn_cancle = (Button) window.findViewById(R.id.btn_cancle);
  22. btn_picture.setOnClickListener(new View.OnClickListener() {// 图库
  23. @SuppressLint("InlinedApi")
  24. @Override
  25. public void onClick(View v) {
  26. Intent intent = new Intent(PhotoSelectActivity.this, AlbumActivity.class);
  27. startActivity(intent);
  28. dialog.dismiss();
  29. }
  30. });
  31. btn_photo.setOnClickListener(new View.OnClickListener() {// 相机
  32. @SuppressLint("InlinedApi")
  33. @Override
  34. public void onClick(View v) {
  35. photo();
  36. dialog.dismiss();
  37. }
  38. });
  39. btn_cancle.setOnClickListener(new View.OnClickListener() {// 取消
  40. @Override
  41. public void onClick(View v) {
  42. dialog.dismiss();
  43. }
  44. });
  45. }
复制代码

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

  1. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  2. switch (requestCode) {
  3. case TAKE_PICTURE:
  4. if (Bimp.tempSelectBitmap.size() < 9 && resultCode == RESULT_OK) {
  5. File file = new File(Environment.getExternalStorageDirectory() + "/" + mImageFileName);
  6. mImagePath = file.getPath();
  7. Bitmap bitmapFromUrl = FileUtils.getBitmapFromUrl(mImagePath, 320, 480);
  8. String[] split = mImagePath.split("0/");
  9. String strUrl = "";
  10. if (split != null && split.length > 0) {
  11. strUrl = split[1];
  12. }
  13. // 重新缓存图片
  14. FileUtils.setPicToView(PhotoSelectActivity.this,bitmapFromUrl, strUrl);
  15. // 获取重新缓存图片的大小
  16. File iconDir = FileUtils.getIconDir(PhotoSelectActivity.this);
  17. String absolutePath = iconDir.getAbsolutePath();
  18. String picPath = absolutePath + strUrl;
  19. ImageItem takePhoto = new ImageItem();
  20. takePhoto.setBitmap(bitmapFromUrl);
  21. takePhoto.setImagePath(picPath);
  22. Bimp.tempSelectBitmap.add(takePhoto);
  23. }
  24. break;
  25. }
  26. }
复制代码

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

  1. /**
  2. * 清空图片集合
  3. */
  4. private void cleanImageList() {
  5. Bimp.max = 0;
  6. Bimp.tempSelectBitmap.clear();
  7. }
复制代码

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

  1. private void initPow() {
  2. View view = getLayoutInflater().inflate(R.layout.listview_popupwindows, null);
  3. final Dialog dialog = new Dialog(this, R.style.Dialog_Fullscreen);
  4. dialog.setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
  5. Window window = dialog.getWindow();
  6. // 设置显示动画
  7. window.setWindowAnimations(R.style.main_menu_animstyle);
  8. WindowManager.LayoutParams wl = window.getAttributes();
  9. wl.x = 0;
  10. wl.y = getWindowManager().getDefaultDisplay().getHeight();
  11. int height = 0;
  12. int h=(int) (mScreenHeight / 1.6);
  13. int listH=AlbumActivity.contentList.size()*DensityUtil.dip2px(AlbumActivity.this,80);
  14. if (listH==0) {
  15. height=h;
  16. }else{
  17. if (listH>h) {
  18. height=h;
  19. }else{
  20. height=listH;
  21. }
  22. }
  23. // 以下这两句是为了保证按钮可以水平满屏
  24. wl.width = ViewGroup.LayoutParams.MATCH_PARENT;
  25. wl.height = height;
  26. // 设置显示位置
  27. dialog.onWindowAttributesChanged(wl);
  28. // 设置点击外围解散
  29. dialog.setCanceledOnTouchOutside(true);
  30. dialog.show();
  31. ListView listview = (ListView) window.findViewById(R.id.listview);
  32. ListAdapter listAdapter = new ListAdapter(AlbumActivity.this);
  33. listview.setAdapter(listAdapter);
  34. listview.setOnItemClickListener(new OnItemClickListener() {
  35. @Override
  36. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
  37. dataList = (ArrayList<ImageItem>) AlbumActivity.contentList.get(arg2).imageList;
  38. String folderName = AlbumActivity.contentList.get(arg2).bucketName;
  39. tv_all.setText("" + folderName);
  40. gridImageAdapter = new AlbumGridViewAdapter(AlbumActivity.this, dataList, Bimp.tempSelectBitmap);
  41. agridView.setAdapter(gridImageAdapter);
  42. dialog.dismiss();
  43. }
  44. });
  45. }
复制代码

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

源码:Androidphoto

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



回复

使用道具 举报