一,概述

本篇博客总结一下自己在开发过程中应用到的一些知识,在本篇博客中带领大家完成用户头像选择或者拍照上传,并对图片进行大小的压缩,和形状的控制,可以将用户选择到的图片裁剪成圆形上传。

ok,我们开始写一个小的demo,完成用户圆形头像的选取,在写即将实现的效果之前我们看一下即将要实现的效果图

二,实现代码

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"android:orientation="vertical" ><RelativeLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#51CA65"android:padding="30dp" ><ImageView
            android:id="@+id/iv_personal_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@drawable/default_personal_image" /></RelativeLayout><Button
        android:id="@+id/btn_change"android:layout_marginTop="6dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="修改头像" ></Button></LinearLayout>

MainActivity.java

package com.example.uploadpicdemo;import java.io.File;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;public class MainActivity extends Activity {protected static final int CHOOSE_PICTURE = 0;protected static final int TAKE_PICTURE = 1;private static final int CROP_SMALL_PICTURE = 2;protected static Uri tempUri;private ImageView iv_personal_icon;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn_change = (Button) findViewById(R.id.btn_change);iv_personal_icon = (ImageView) findViewById(R.id.iv_personal_icon);btn_change.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {showChoosePicDialog();}});}/*** 显示修改头像的对话框*/protected void showChoosePicDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("设置头像");String[] items = { "选择本地照片", "拍照" };builder.setNegativeButton("取消", null);builder.setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {case CHOOSE_PICTURE: // 选择本地照片Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);openAlbumIntent.setType("image/*");startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);break;case TAKE_PICTURE: // 拍照Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);tempUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "image.jpg"));// 指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);startActivityForResult(openCameraIntent, TAKE_PICTURE);break;}}});builder.create().show();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) { // 如果返回码是可以用的switch (requestCode) {case TAKE_PICTURE:startPhotoZoom(tempUri); // 开始对图片进行裁剪处理break;case CHOOSE_PICTURE:startPhotoZoom(data.getData()); // 开始对图片进行裁剪处理break;case CROP_SMALL_PICTURE:if (data != null) {setImageToView(data); // 让刚才选择裁剪得到的图片显示在界面上}break;}}}/*** 裁剪图片方法实现* * @param uri*/protected void startPhotoZoom(Uri uri) {if (uri == null) {Log.i("tag", "The uri is not exist.");}tempUri = uri;Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");// 设置裁剪intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", 150);intent.putExtra("outputY", 150);intent.putExtra("return-data", true);startActivityForResult(intent, CROP_SMALL_PICTURE);}/*** 保存裁剪之后的图片数据* * @param* * @param picdata*/protected void setImageToView(Intent data) {Bundle extras = data.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable("data");photo = Utils.toRoundBitmap(photo, tempUri); // 这个时候的图片已经被处理成圆形的了iv_personal_icon.setImageBitmap(photo);uploadPic(photo);}}private void uploadPic(Bitmap bitmap) {// 上传至服务器// ... 可以在这里把Bitmap转换成file,然后得到file的url,做文件上传操作// 注意这里得到的图片已经是圆形图片了// bitmap是没有做个圆形处理的,但已经被裁剪了String imagePath = Utils.savePhoto(bitmap, Environment.getExternalStorageDirectory().getAbsolutePath(), String.valueOf(System.currentTimeMillis()));Log.e("imagePath", imagePath+"");if(imagePath != null){// 拿着imagePath上传了// ...}}
}

ok,大功告成,最后别忘了在清单文件中添加读写sd可权限,不然得不到imagePath

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

关于上面的隐示intent如果有什么不懂的可以参考

http://blog.csdn.net/ydxlt/article/details/47983661

关于startActivityForResult启动activity返回结果,在一个activity需要启动另外一个Activity得到数据的时候,我们可以通过意图启动那个Activity返回数据,然后重写Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法,在里面根据我们启动的时候传入的请求码(requestCode)判断是启动的哪个Activity返回了,然后在从data参数中取得返回的数据信息,在此之前我们得判断一下启动作为结果返回的Activity的状态,也就是判断一下resultCode是运行的时候被取消了还是运行正常,还是其他情况(RESULT_FIRST_USER),如果resultCode返回RESULT_OK表示用户在启动的Activity中选择了数据,这个时候我们可以从data中去掉相应的信息了,如果resultCode返回RESULT_CANCELED者没必要处理数据了因为用户没在启动的activity中做任何操作就返回了

在一个activity中可以多次通过startActivityForResult启动其他Activity得到数据。

eclipse demo下载地址:http://download.csdn.net/detail/ydxlt/9053973

Android Studio Demo clone地址(新):https://github.com/ydxlt/UploadPicDemo.git

Android开发之用户头像上传相关推荐

  1. Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例)

    Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例) 标签: 注册登录Android开发servlet 2017-04-18 20:34  454人阅读  评论(1) ...

  2. Java实现用户头像上传(修改默认文件大小限制)

    概述 每次说起文件上传,就不得不提一下前端的实现方式,说来也奇怪,本博主最热门的博客居然也是文件上传,3万多的访问量占了总访问量的一多半:<传统form表单提交方式的文件上传与文件存储>, ...

  3. php文件 用户头像上传代码,网页web上传用户头像代码实现(美图秀秀开放)

    网页web上传用户头像代码实现(美图秀秀开放) 在制作论坛或者一些门户社交网站的时候,经常要获取用户的头像.之前我们一般都是自己制作flash插件头像上传.或者用js来自己开发一个头像上传功能.比如有 ...

  4. Day88.七牛云: 房源图片、用户头像上传 Common-upload、Webuploader

    目录 一.七牛云存储 4.鉴权 二.开发者中心,上传.删除测试 1.添加依赖 2.代码测试 3. 封装工具类 三.房源图片上传 1. spring mvc 配置上传支持 2. house/show.h ...

  5. android项目中使用的服务器上,android 开发中使用okhttp上传文件到服务器

    开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片. 使用okhttp会是一个很好的选择.它使用很简单,而且运行效率也很高. 首先,在 app/build.gradle 的 ...

  6. PHP+ajaxfileupload 实现用户头像上传

    今天写项目的时候需要一个让登录的用户上传头像的功能,然后上网搜了一下,发现有一个不错的Ajax插件ajaxfileupload,所以就拿来用,感觉效果不错,在这里和大家分享一下.下面将用PHP+aja ...

  7. SpringBoot OSS实战之用户头像上传

    文章目录 前言 OSS整合 前端 获取授权 上传图片 上传URL到服务端 完整代码 后端 图片URL接收 补充 效果演示 前言 已经开始对写接口产生厌烦了,毫无技术含量,不过也是最近把用户的比较核心的 ...

  8. 用户头像上传之 jQuery+ajax+php+预处理

    小知识: dataType:预期的服务器返回的数据类型 当设置了dataType:"json"时,后端返回了json,就自动将JSON格式字符串转换为js对象,如果后端返回了Str ...

  9. demo项目开发笔录(头像上传)

    这里记录下一个完整的头像上传过程,实用部分笔者会指出,嘿嘿嘿. 工具:idea css文件:w3.css 声明,笔者没有使用ajax来上传头像,原因是头像为单个,内容小,有需要转ajax的简单修改即可 ...

最新文章

  1. python进阶学啥书籍_2018年Python学习进阶书籍推荐
  2. php获取当前周得周一_php一行代码获取本周一,本周日,上周一,上周日,本月一日,本月最后一日,上月一日,上月最后一日日期...
  3. opencv 分割边界_电影观众:场景边界分割
  4. 自学转行成前端工程师,三面拿下字节跳动offer
  5. 如何得到给定序列的互补序列以及反向互补序列
  6. kubernetes-----pod资源创建与Harbor私有仓库
  7. 迈巴赫S480升级原厂H17全车钢琴木饰板,五座改四座,电动后门
  8. android netd守护进程机制 --- netd分析
  9. redis连接耗尽问题排查
  10. Zephyr (nrf)
  11. 【7.0】 数学建模 | 相关系数详解 | Person相关系数、Spearman相关系数
  12. c语言两千行以内代码,C语言的教务管理系统(2000行代码)(106页)-原创力文档
  13. 不均匀光照文本图像的二值化
  14. NYOJ 304 节能【记忆化搜索】
  15. 第一篇 入门必备 (Android学习笔记)
  16. 上海快速拿计算机本科文凭,怎么快速拿文凭,急!(建议收藏)
  17. [附源码]Nodejs计算机毕业设计基于HTML5的智能仓储管理系统Express(程序+LW)
  18. SLAM论文速递【SLAM—— DynaSLAM II:紧耦合多目标跟踪与SLAM—4.19(2)
  19. 微信小程序本地连接后端开发
  20. div中加入内容会下沉

热门文章

  1. zynq 移植ubuntu_ROS ZYNQ移植
  2. c1科目三灯光全语言播报,驾照科目三灯光模拟考试语音提示
  3. excel两个字符串相减_Excel用Substitute函数替换的5个实例及与Replace函数的区别
  4. 导师的SCI很少一作和通讯是怎么回事?
  5. 仿小米视频下滑视频动画效果
  6. SQL: 第二高的薪水
  7. 西蒙菲莎大学计算机研究性硕士,不只是知名大学:西蒙菲莎大学你需要知道这些!...
  8. 【动态规划】多重背包问题
  9. [luogu]P1600 天天爱跑步[LCA]
  10. 隐私计算岗高薪酬冲上热搜!高居十大数字技术薪酬榜首!成2022求职最HOT职位