热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现图片上传功能

这篇文章主要为大家详细介绍了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<&#63;> arg0, View arg1, int arg2, long arg3) {
    dataList = (ArrayList) 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

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


推荐阅读
  • 如果你对项目管理和系统架构感兴趣,欢迎关注微信订阅号“softjg”,加入我们这个PM和架构师的大家庭。本文将探讨编写高质量软件架构文档的重要性及其优势。良好的架构文档不仅能够促进不同利益相关者之间的沟通与理解,还能为项目的长期维护和扩展提供坚实的基础。通过详细记录系统的设计决策和关键组件,架构文档能够确保团队成员在项目周期内保持一致性和高效协作。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 新年伊始,正是学习的最佳时机。本文全面解析了CK1957-Zookeeper的核心概念与实践技巧,旨在帮助初学者快速掌握这一深度学习工具。通过详细的理论讲解和实际操作示例,读者可以更好地理解Zookeeper的工作原理及其在分布式系统中的应用。无论是新手还是有一定基础的学习者,都能从中受益匪浅。 ... [详细]
  • 探究Oracle数据库字符集编码的详细方法与实践
    本文深入探讨了Oracle数据库字符集编码的详细方法与实践。首先,通过执行 `SELECT USERENV('language') FROM DUAL;` 查询服务端字符集编码。其次,通过在注册表中搜索 `NLS_LANG` 参数来查看客户端字符集编码。此外,文章还介绍了如何在不同场景下正确配置和转换字符集,以确保数据的一致性和完整性。 ... [详细]
  • 在执行 Vim/VM 命令时遇到错误提示:检测到名为
    在使用 Docker 时,通过 Vim 编辑 Dockerfile 文件时遇到了错误提示:“检测到名为 .dockerfile.swp 的交换文件”。这一问题通常是因为上次编辑该文件时意外中断,导致系统生成了临时的交换文件。为了解决这个问题,可以手动删除该交换文件或使用 Vim 的恢复功能来恢复未保存的更改。 ... [详细]
  • jQuery学习笔记:深入理解事件委派(2014年8月3日)
    在jQuery中,事件委托机制主要通过`closest()`方法实现。该方法用于查找与指定选择器匹配的最近祖先元素,从当前元素开始逐级向上遍历DOM树。这一技术不仅提高了代码的效率,还能有效处理动态生成的元素。参考资料:jQuery遍历方法详解。 ... [详细]
  • 全面解析:Hadoop技术栈中的Linux操作系统概览
    全面解析:Hadoop技术栈中的Linux操作系统概览 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 深入探讨Photoshop的高级应用与技巧
    本文深入探讨了Photoshop的高级应用与技巧,不仅涵盖了常用的快捷键,如矩形选框工具(M)、移动工具(V)、套索工具(L)、魔棒工具(W)、裁剪工具(C)等,还介绍了更多专业功能,如图层蒙版、混合模式和智能对象的使用方法,帮助用户提升图像处理的效率和质量。 ... [详细]
  • IDEA中高效利用代码变量名替换功能提升编程效率
    在使用 IntelliJ IDEA 进行公司项目代码审查时,我发现许多变量的命名不符合驼峰式命名规范。起初,我尝试手动逐个修改这些变量名,但效率低下。后来,我偶然发现了 IDEA 中的代码变量名替换功能,这极大地提高了我的工作效率。通过该功能,我可以快速批量地将不规范的变量名修改为符合命名规则的形式,不仅节省了时间,还减少了出错的可能性。此外,我还利用这一功能对整个项目的代码进行了全面的优化,确保所有变量命名一致且易于理解。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
author-avatar
mobiledu2502907083
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有