位置: 编程技术 - 正文

Android图片上传,可以选择多张图片,缩放预览,拍照上传等(安卓如何实现图片上传功能)

编辑:rootadmin

推荐整理分享Android图片上传,可以选择多张图片,缩放预览,拍照上传等(安卓如何实现图片上传功能),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:安卓如何实现图片上传功能,android 图片上传,安卓上传照片,安卓上传照片,安卓如何实现图片上传功能,android多图上传,android图片上传的题,android 图片上传,内容如对您有帮助,希望把文章链接给更多的朋友!

仿照微信,朋友圈分享图片功能 。可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 。很不错的源码,大家有需要可以下载看看 。

微信

微信

微信

Android图片上传,可以选择多张图片,缩放预览,拍照上传等(安卓如何实现图片上传功能)

微信

下载地址 : 微信上传图片源码

//部分代码如下

[java] view plaincopypackage com.king.photo.activity; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; import com.king.photo.R; import com.king.photo.util.Bimp; import com.king.photo.util.FileUtils; import com.king.photo.util.ImageItem; import com.king.photo.util.PublicWay; import com.king.photo.util.Res; //首页面activity public class MainActivity extends Activity { private GridView noScrollgridview; private GridAdapter adapter; private View parentView; private PopupWindow pop = null; private LinearLayout ll_popup; public static Bitmap bimap ; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Res.init(this); bimap = BitmapFactory.decodeResource( getResources(), R.drawable.icon_addpic_unfocused); PublicWay.activityList.add(this); parentView = getLayoutInflater().inflate(R.layout.activity_selectimg, null); setContentView(parentView); Init(); } public void Init() { pop = new PopupWindow(MainActivity.this); View view = getLayoutInflater().inflate(R.layout.item_popupwindows, null); ll_popup = (LinearLayout) view.findViewById(R.id.ll_popup); pop.setWidth(LayoutParams.MATCH_PARENT); pop.setHeight(LayoutParams.WRAP_CONTENT); pop.setBackgroundDrawable(new BitmapDrawable()); pop.setFocusable(true); pop.setOutsideTouchable(true); pop.setContentView(view); RelativeLayout parent = (RelativeLayout) view.findViewById(R.id.parent); Button bt1 = (Button) view .findViewById(R.id.item_popupwindows_camera); Button bt2 = (Button) view .findViewById(R.id.item_popupwindows_Photo); Button bt3 = (Button) view .findViewById(R.id.item_popupwindows_cancel); parent.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub pop.dismiss(); ll_popup.clearAnimation(); } }); bt1.setOnClickListener(new OnClickListener() { public void onClick(View v) { photo(); pop.dismiss(); ll_popup.clearAnimation(); } }); bt2.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(MainActivity.this, AlbumActivity.class); startActivity(intent); overridePendingTransition(R.anim.activity_translate_in, R.anim.activity_translate_out); pop.dismiss(); ll_popup.clearAnimation(); } }); bt3.setOnClickListener(new OnClickListener() { public void onClick(View v) { pop.dismiss(); ll_popup.clearAnimation(); } }); noScrollgridview = (GridView) findViewById(R.id.noScrollgridview); noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT)); adapter = new GridAdapter(this); adapter.update(); noScrollgridview.setAdapter(adapter); noScrollgridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { if (arg2 == Bimp.tempSelectBitmap.size()) { Log.i("ddddddd", "----------"); ll_popup.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.activity_translate_in)); pop.showAtLocation(parentView, Gravity.BOTTOM, 0, 0); } else { Intent intent = new Intent(MainActivity.this, GalleryActivity.class); intent.putExtra("position", "1"); intent.putExtra("ID", arg2); startActivity(intent); } } }); } @SuppressLint("HandlerLeak") public class GridAdapter extends BaseAdapter { private LayoutInflater inflater; private int selectedPosition = -1; private boolean shape; public boolean isShape() { return shape; } public void setShape(boolean shape) { this.shape = shape; } public GridAdapter(Context context) { inflater = LayoutInflater.from(context); } public void update() { loading(); } public int getCount() { if(Bimp.tempSelectBitmap.size() == 9){ return 9; } return (Bimp.tempSelectBitmap.size() &#; 1); } public Object getItem(int arg0) { return null; } public long getItemId(int arg0) { return 0; } public void setSelectedPosition(int position) { selectedPosition = position; } public int getSelectedPosition() { return selectedPosition; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = inflater.inflate(R.layout.item_published_grida, parent, false); holder = new ViewHolder(); holder.image = (ImageView) convertView .findViewById(R.id.item_grida_image); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (position ==Bimp.tempSelectBitmap.size()) { holder.image.setImageBitmap(BitmapFactory.decodeResource( getResources(), R.drawable.icon_addpic_unfocused)); if (position == 9) { holder.image.setVisibility(View.GONE); } } else { holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap()); } return convertView; } public class ViewHolder { public ImageView image; } Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: adapter.notifyDataSetChanged(); break; } super.handleMessage(msg); } }; public void loading() { new Thread(new Runnable() { public void run() { while (true) { if (Bimp.max == Bimp.tempSelectBitmap.size()) { Message message = new Message(); message.what = 1; handler.sendMessage(message); break; } else { Bimp.max &#;= 1; Message message = new Message(); message.what = 1; handler.sendMessage(message); } } } }).start(); } } public String getString(String s) { String path = null; if (s == null) return ""; for (int i = s.length() - 1; i > 0; i&#;&#;) { s.charAt(i); } return path; } protected void onRestart() { adapter.update(); super.onRestart(); } private static final int TAKE_PICTURE = 0x; public void photo() { Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(openCameraIntent, TAKE_PICTURE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case TAKE_PICTURE: if (Bimp.tempSelectBitmap.size() < 9 && resultCode == RESULT_OK) { String fileName = String.valueOf(System.currentTimeMillis()); Bitmap bm = (Bitmap) data.getExtras().get("data"); FileUtils.saveBitmap(bm, fileName); ImageItem takePhoto = new ImageItem(); takePhoto.setBitmap(bm); Bimp.tempSelectBitmap.add(takePhoto); } break; } } public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { for(int i=0;i<PublicWay.activityList.size();i&#;&#;){ if (null != PublicWay.activityList.get(i)) { PublicWay.activityList.get(i).finish(); } } System.exit(0); } return true; } }

下载地址 : 微信上传图片源码

备份下载地址: 实现效果 主要是通过点击&#;从本地相册中添加图片,同时显示图片至GridView.点击图片可以进行删除操作,同时界面中的发布EditView控件也很好看,不足之处在于&#;好没有移动至最后,但原理相同. 二. 项目工程结构三. 界面布局详细代码

1.主界面activity_main.xml 主要通过相对布局实现,第一部分是底部的TextView,中间是EditView和GridView相对布局,下面是两个按钮.同时EditView调用res/drawable-hdpi中的editview_shape.xml,GridView显示的每张图片通过griditem_addpic.xml实现.

[html] view plaincopy<RelativeLayout xmlns:android=" xmlns:tools=" android:id="@&#;id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.suishoupaipublish.MainActivity" tools:ignore="MergeRootFrame" > <!-- 顶部添加文字 --> <RelativeLayout android:id="@&#;id/Layout_top" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="dp" android:layout_marginTop="5dp" android:layout_alignParentTop="true" android:gravity="center"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="sp" android:gravity="center" android:text="发布信息" /> </RelativeLayout> <!-- 底部按钮 --> <RelativeLayout android:id="@&#;id/Layout_bottom" android:layout_alignParentBottom="true" android:layout_width="fill_parent" android:layout_height="dp" android:gravity="center" > <Button android:id="@&#;id/button1" android:layout_width="wrap_content" android:layout_height="fill_parent" android:textSize="sp" android:text="发布拍拍" /> <Button android:id="@&#;id/button2" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_toRightOf="@&#;id/button1" android:textSize="sp" android:text="取消发布" /> </RelativeLayout> <!-- 显示图片 --> <RelativeLayout android:id="@&#;id/Content_Layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/Layout_bottom" android:layout_below="@id/Layout_top" android:gravity="center"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_alignParentBottom="true" > <!-- 设置运行多行 设置圆角图形 黑色字体--> <EditText android:id="@&#;id/editText1" android:layout_height="dp" android:layout_width="fill_parent" android:textColor="#" android:layout_margin="dp" android:textSize="sp" android:hint="随手说出你此刻的心声..." android:maxLength="" android:singleLine="false" android:background="@drawable/editview_shape" /> <!-- 网&#;显示图片 行列间距5dp 每列宽度dp --> <GridView android:id="@&#;id/gridView1" android:layout_width="fill_parent" android:layout_height="dp" android:layout_margin="dp" android:background="#EFDFDF" android:horizontalSpacing="5dp" android:verticalSpacing="5dp" android:numColumns="4" android:columnWidth="dp" android:stretchMode="columnWidth" android:gravity="center" > </GridView> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="(友情提示:只能添加9张图片,长按图片可以删除已添加图片)" android:gravity="center" /> </LinearLayout> </RelativeLayout> </RelativeLayout> 2.显示ImageView图片布局griditem_addpic.xml[html] view plaincopy<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:descendantFocusability="blocksDescendants" android:orientation="vertical" > <RelativeLayout android:layout_gravity="center" android:layout_width="dp" android:layout_height="dp" android:orientation="vertical" > <ImageView android:layout_marginTop="dp" android:layout_marginRight="dp" android:id="@&#;id/imageView1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY" android:src="@drawable/gridview_addpic" /> </RelativeLayout> </LinearLayout> 3.设置EditView控件圆角和颜色 editview_shape.xml[html] view plaincopy<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=" android:shape="rectangle" android:padding="dp"> <!-- 填充editView的颜色 --> <soild android:color="#ffffff"/> <!-- 设置圆角的弧度,radius半径越大,editView的边角越圆 --> <corners android:radius="dp" android:bottomRightRadius="dp" android:bottomLeftRadius="dp" android:topLeftRadius="dp" android:topRightRadius="dp"/> <stroke android:color="#CD" android:width="4px" /> </shape> 四. 代码详解 它主要是思想如下: 1.通过SimpleAdapter适配器实现实现加载图片,在gridView1.setOnItemClickListener()点击函数中响应不同操作. 2.当点击加号图片(&#;)时,调用本地相册通过Intent实现获取图片路径存于字符串pathImage. 3.获取图片路径后在onResume中刷新图片,通过GridView的setAdapter()和notifyDataSetChanged()()函数刷新加载图片. 4.点击图片时会获取其position,通过dialog()函数弹出对话框提示是否删除,通过remove实现删除. 具体代码如下所示:[java] view plaincopypublic class MainActivity extends Activity { private GridView gridView1; //网&#;显示缩略图 private Button buttonPublish; //发布按钮 private final int IMAGE_OPEN = 1; //打开图片标记 private String pathImage; //选择图片路径 private Bitmap bmp; //导入临时图片 private ArrayList<HashMap<String, Object>> imageItem; private SimpleAdapter simpleAdapter; //适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* * 防止键盘挡住输入框 * 不希望遮挡设置activity属性 android:windowSoftInputMode="adjustPan" * 希望动态调整高度 android:windowSoftInputMode="adjustResize" */ getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_PAN); //锁定屏幕 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_main); //获取控件对象 gridView1 = (GridView) findViewById(R.id.gridView1); /* * 载入默认图片添加图片加号 * 通过适配器实现 * SimpleAdapter参数imageItem为数据源 R.layout.griditem_addpic为布局 */ //获取资源图片加号 bmp = BitmapFactory.decodeResource(getResources(), R.drawable.gridview_addpic); imageItem = new ArrayList<HashMap<String, Object>>(); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("itemImage", bmp); imageItem.add(map); simpleAdapter = new SimpleAdapter(this, imageItem, R.layout.griditem_addpic, new String[] { "itemImage"}, new int[] { R.id.imageView1}); /* * HashMap载入bmp图片在GridView中不显示,但是如果载入资源ID能显示 如 * map.put("itemImage", R.drawable.img); * 解决方法: * 1.自定义继承BaseAdapter实现 * 2.ViewBinder()接口实现 * 参考 */ simpleAdapter.setViewBinder(new ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { // TODO Auto-generated method stub if(view instanceof ImageView && data instanceof Bitmap){ ImageView i = (ImageView)view; i.setImageBitmap((Bitmap) data); return true; } return false; } }); gridView1.setAdapter(simpleAdapter); /* * 监听GridView点击事件 * 报错:该函数必须抽象方法 故需要手动导入import android.view.View; */ gridView1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { if( imageItem.size() == ) { //第一张为默认图片 Toast.makeText(MainActivity.this, "图片数9张已满", Toast.LENGTH_SHORT).show(); } else if(position == 0) { //点击图片位置为&#; 0对应0张图片 Toast.makeText(MainActivity.this, "添加图片", Toast.LENGTH_SHORT).show(); //选择图片 Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, IMAGE_OPEN); //通过onResume()刷新数据 } else { dialog(position); //Toast.makeText(MainActivity.this, "点击第"&#;(position &#; 1)&#;" 号图片", // Toast.LENGTH_SHORT).show(); } } }); } //获取图片路径 响应startActivityForResult protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //打开图片 if(resultCode==RESULT_OK && requestCode==IMAGE_OPEN) { Uri uri = data.getData(); if (!TextUtils.isEmpty(uri.getAuthority())) { //查询选择图片 Cursor cursor = getContentResolver().query( uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); //返回 没找到选择图片 if (null == cursor) { return; } //光标移动至开头 获取图片路径 cursor.moveToFirst(); pathImage = cursor.getString(cursor .getColumnIndex(MediaStore.Images.Media.DATA)); } } //end if 打开图片 } //刷新图片 @Override protected void onResume() { super.onResume(); if(!TextUtils.isEmpty(pathImage)){ Bitmap addbmp=BitmapFactory.decodeFile(pathImage); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("itemImage", addbmp); imageItem.add(map); simpleAdapter = new SimpleAdapter(this, imageItem, R.layout.griditem_addpic, new String[] { "itemImage"}, new int[] { R.id.imageView1}); simpleAdapter.setViewBinder(new ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { // TODO Auto-generated method stub if(view instanceof ImageView && data instanceof Bitmap){ ImageView i = (ImageView)view; i.setImageBitmap((Bitmap) data); return true; } return false; } }); gridView1.setAdapter(simpleAdapter); simpleAdapter.notifyDataSetChanged(); //刷新后释放防止手机休眠后自动添加 pathImage = null; } } /* * Dialog对话框提示用户删除操作 * position为删除图片位置 */ protected void dialog(final int position) { AlertDialog.Builder builder = new Builder(MainActivity.this); builder.setMessage("确认移除已添加图片吗?"); builder.setTitle("提示"); builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); imageItem.remove(position); simpleAdapter.notifyDataSetChanged(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } } 同时需要在AndroidMainfest.xml中添加权限操作SD卡和网络上传至服务器.[html] view plaincopy<!-- 申明网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 申明权限 操作SD卡 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 五. 总结 该文章需要注意一个地方:在使用SimpleAdapter适配器加载bmp图片时,可能在GridView中不显示.即HashMap中map.put("itemImage",bmp)不显示图片,而使用put装入R.drawable.img却能显示. 这时有两种解决方法,一种是自定义继承BaseAdapter的适配器实现;另一种方法则是如上所示通过ViewBinder()接口实现,感谢博主dmin_提供的方法. 下载地址:

Android回调机制的讨论 原文链接:

Android自定义系列(2)——拟物化类弹窗式视频播放窗口 这是个自定义样式的简易播放器窗口,建立在FrameLayout上的隐藏窗口,触发可显示视频窗口。实现了从asserts目录下播放视频资源。1.在主布局文件中,设

Android 断点续传的实现 这两天用了下android5.1下载功能,简直鸡肋。无奈自己研究了半天的断点续传,总结一下。本文参考了慕课网XRay_Chen大神的视频,在此表示衷心的感谢!

标签: 安卓如何实现图片上传功能

本文链接地址:https://www.jiuchutong.com/biancheng/386085.html 转载请保留说明!

上一篇:Android底部tab与标题栏相结合(android底部弹出页面)

下一篇:Android回调机制的讨论(android回调函数)

  • 企业间贴现如何开票
  • 没有发票的房租如何入账
  • 现代服务包含哪些服务
  • 电子税务局发票验旧怎么操作
  • 上年结转未抵扣
  • 香港保险代理人佣金
  • 房产经纪公司成本费用
  • 增值税期初应补税额计算
  • 会费要交增值税吗
  • 小规模企业有了增值税吗
  • 参与工会职工应享受哪些福利待遇
  • 固定资产残值怎么计算出来的
  • 建设工程中税费如何承担
  • 委托加工合同如何标注多个地址
  • 未确认融资费用借贷方向
  • 企业网上申报国税流程
  • 公司注销时资本要交税吗
  • 公司一年未经营怎么赔偿
  • 外埠纳税人经营地报验登记税务管理论文
  • 企业所得税季报资产总额怎么填
  • 周转天数是越大越好吗
  • 对方发票丢失开什么证明
  • 未分配利润可以转实收吗
  • 服务业成本怎么做账
  • 金税盘服务费计入什么会计科目
  • 期货手续费会计分录
  • 小微企业行业划分标准 工信部
  • 内部交易逆流如何算利润
  • 加工费的会计处理
  • 公司租房中介费能报销吗
  • 代金券消费怎么做分录
  • 会计新准则讲解
  • 境外汇款所得税缴纳规定
  • 股票发行费用怎么算
  • pytorch入门教程(非常详细)
  • vue2.0解决跨域问题
  • php连接mysql数据库的几种方式及区别
  • php 微信公众号
  • php邮件发送类
  • vue2.0安装
  • 面试宝典下载
  • php判断链表是否有环
  • php中表单的使用
  • 公司分红的会计分录
  • mysql数据库uuid
  • 金税盘离线开票时间超限怎么办
  • 什么企业不用交残保金
  • 新准则下开办费摊销
  • 原材料发生退货怎么处理
  • 小微企业能申请高新吗
  • 发票入账的管理规定
  • 企业支付临时工劳务报酬需要取得发票吗
  • 一般纳税人购买汽车会计分录
  • 调整以前年度多计提的增值税
  • 其他权益工具投资公允价值变动计入什么科目
  • 发票具有哪些情况可以开
  • 财产租赁合同印花税计税依据
  • 暂估材料发票长期不到
  • 增值税是否计入税金及附加
  • 资本公积其他资本公积用途
  • 开设明细账
  • mysql官方监控工具
  • linux批量操作
  • ssh -i命令
  • 360安全卫士中心未完全开启
  • win7系统安装教程不用u盘
  • Win7怎么把桌面文件迁移到D盘中
  • svcinit.exe - svcinit是什么进程
  • windows8咋关机
  • win10电源选项
  • win7开机每次都要输入用户名
  • 铁嘴王指什么动物
  • jsp分页显示
  • 网页使用的字体中最具可读性.最易浏览的是
  • jquery技巧
  • JavaScript中的math.pi
  • js原生dialog
  • 使用驱动器u盘之前需要格式化
  • python中的变量
  • 安卓音频分析软件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设