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

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

(0)

相关推荐

  • android基于dialog实现等待加载框示例

    最近想找一些新颖的等待框,但一直找不到理想的效果,没有办法,只好自己动手丰衣足食了. 先给大家看个效果图! 首先就是新建一个dialog的XML文件了 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="w

  • android使用AsyncTask实现多线程下载实例

    AsyncTask不仅方便我们在子线程中对UI进行更新操作,还可以借助其本身的线程池来实现多线程任务.下面是一个使用AsyncTask来实现的多线程下载例子. 01 效果图 02 核心类 - DownloadTask.class public class DownloadTask extends AsyncTask<String, Integer, Integer> { public static final int TYPE_SUCCESS = 0; public static final

  • android多种滑动冲突的解决方案

    一.前言 Android 中解决滑动的方案有2种:外部拦截法 和内部拦截法. 滑动冲突也存在2种场景: 横竖滑动冲突.同向滑动冲突. 所以我就写了4个例子来学习如何解决滑动冲突的,这四个例子分别为: 外部拦截法解决横竖冲突.外部拦截法解决同向冲突.内部拦截法解决横竖冲突.内部拦截法解决同向冲突. 先上效果图: 二.实战 1.外部拦截法,解决横竖冲突 思路是,重写父控件的onInterceptTouchEvent方法,然后根据具体的需求,来决定父控件是否拦截事件.如果拦截返回返回true,不拦截返

  • Android 中StringBuffer 和StringBuilder常用方法

    如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类:如果要保证线程安全,自然是StringBuffer. 除了对多线程的支持不一样外,这两个类的使用方式和结果几乎没有任何差别, 区别在于StringBufferd支持并发操作,线性安全的,适 合多线程中使用.StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用.新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高. Str

  • 很实用的Android日期计算类

    分享一个使用较方便的日期计算类: package com.utils.datecount; import java.text.SimpleDateFormat; import java.util.Date; import java.util.GregorianCalendar; public class DateCount { /** * datelevel 0为7天内,1为7到15天,2为15天以上 */ public static int datelevel = 0; public stat

  • Android 两种方法实现长按返回健退出

     Android 长按返回健退出 背景 平常比较常见的都是一定时间间隔内按两次返回键来退出应用,并且第一次点击会有相应的提示,网上资料比较多,这里写一下,长按返回键退出. 实现 实现的方案常用的有两个: 重写dispatchKeyEvent(KeyEvent event)方法 重写onKeyDown(int keyCode, KeyEvent event)方法 方案一 @Override public boolean dispatchKeyEvent(KeyEvent event) { if (

  • Android获取联系人姓名和电话代码

    在开发中往往有要获取联系人列表的功能,但是这次却不是获取联系人列表,而是在联系人列表点击单个联系人,获取单个联系人的姓名和电话,并设置在指定的输入框内,方便用户的使用:以下是实现的代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la

  • 详解Android中的MVP架构分解和实现

    1.概述 传统的Android开发架构一般是MVC模式, Model:业务逻辑和实体模型 View:对应于布局文件 Controllor:对应于Activity 单独从逻辑看起来非常好,与我们做Web开发时,开发模式类似,但在实际开发中,View对应于布局文件,实际上关于该布局文件中的数据绑定的操作,事件处理的代码都在Activity中,Activity既像View又像Controller(MVVP架构中包括数据绑定),导致Activity中职责太重,耦合度大.修改和维护起来非常麻烦. 2.MV

  • Android Listview中显示不同的视图布局详解及实例代码

    Android Listview中显示不同的视图布局 1. 使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够回收并重用,但是多个Item布局类型不同时,convertView的回收和重用会出现问题.比如有些行为纯文本,有些行则是图文混排,这里纯文本行为一类布局,图文混排的行为第二类布局.单一类型的ListView很简单,下面着重介绍一下ListView

  • Android实现ImageView阴影和图层效果

    本文实例为大家分享了ImageView阴影和图层效果的实现代码,供大家参考,具体内容如下 import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import and

  • Android引导页面的简单实现

    第一次进入应用的时候,都会有一个引导页面,引导页面的实现起来也很简单,实现的方式也有很多,下面是自己写的一个引导页面的效果,大致的实现思路为: 最外层是一个FragmentActivity,里面包含4个fragment,在fragment中给ViewPager开一个循环,这样实现了图片播,其实效果就是在FragmentActivity中几个fragment滑动切换, fragment中ViewPager无限轮播和滑动切换: 下面为代码实现: public class MainActivity e

随机推荐