内容概要

  • 实例演示和原理讲解
  • 从摄像头中获取图像
  • 从图库中获取图像
  • 在Android上对图像进行裁剪
  • 图像上传并在服务器保存图像

实例演示和原理讲解

头像上传流程

从摄像头中获取图像

本课时的主要内容如下:

  • 讲解Android客户端界面的设计与实现
  • 讲解如何调用摄像头拍摄一张照片
  • 讲解将摄像头拍摄的图像显示在界面上
public class MainActivity extends AppCompatActivity {private static int CAMERA_REQUEST_COOE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//创建摄像头按钮的点击事件Button btn_camera = (Button) findViewById(R.id.btn_camera);btn_camera.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent, CAMERA_REQUEST_COOE);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == CAMERA_REQUEST_COOE) {//判断用户点击了拍照还是取消,如果是取消的话就不用进行数据的处理if (data == null) {return;} else {Bundle extras = data.getExtras();if (extras != null) {//创建Bitmap用于保存用户拍照的数据Bitmap bm = extras.getParcelable("data");ImageView imageView = (ImageView) findViewById(R.id.imageView);imageView.setImageBitmap(bm);}}}}
}

从图库中获取图像

本课时的主要内容如下:

  • 讲解调用系统图库并从图库中选取一张图片
  • 讲解如何将获取到的图片存储到SD卡中
//创建图像选择按钮的点击事件
Button btn_gallery = (Button) findViewById(R.id.btn_gallery);btn_gallery.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType("image/*");startActivityForResult(intent,GALLERY_REQUEST_COOE);}});

在上面的onActivityResult方法中添加以下判断代码:

else if(requestCode == GALLERY_REQUEST_CODE){if(data == null){return;}//当使用这种方法打开图库并选择一张照片后返回后onActivityResult方法中的data参数将会包含一个    //uri(就是选择图片所对应的uri统一资源标识符)Uri uri;uri = data.getData();//获取该uri//注:在Android中常用的uri有两种一种是以content开头的,另一种是以file开头的,那么从图库中获取的//uri到底是哪种类型的uri呢?Toast.makeText(MainActivity.this,uri.toString(),Toast.LENGTH_LONG).show();//content类型的,对于content类型的uri不能直接对他进行复制的操作Uri fileUri = convertUri(uri);//转换为file类型的uri}
private Uri convertUri(Uri uri){InputStream is = null;try {is = getContentResolver().openInputStream(uri);Bitmap bitmap = BitmapFactory.decodeStream(is);is.close();//将Bitmap类型转换为uri,将Bitmap中的数据写入到sdCard中的图像文件中,然后返回该图像的//uri,这样即实现将图片保存到sdcard中又实现了将content类型uri转换为file类型的urireturn saveBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}private Uri saveBitmap(Bitmap bm){//获取sdcard中的一个路径File tmpDir = new File(Environment.getExternalStorageDirectory()+"/avater");if(tmpDir.exists()){tmpDir.mkdir();}File img = new File(tmpDir.getAbsolutePath()+"avater.png");try {FileOutputStream fos = new FileOutputStream(img);//将图像的数据写入该输出流中,第一个参数是要压缩的格式,第二个参数:图片的质量bm.compress(Bitmap.CompressFormat.PNG,85,fos);fos.flush();fos.close();return Uri.fromFile(img);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在Android上对图像进行裁剪

本课时的主要内容如下:

  • 讲解调用系统图像裁剪功能进行图像裁剪
  • 讲解两种Uri的转换
  • 讲解裁剪后的数据的处理

裁剪方法:

private void startImageZoom(Uri uri){Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri,"image/*");//通过参数uri将数据传递给裁剪界面intent.putExtra("crop","true");//设置在开启的intent中显示的view是可裁剪的intent.putExtra("aspectX",1);   //设置裁剪的宽高比例intent.putExtra("aspectY",1);intent.putExtra("outputX",150); //裁剪图片的宽高intent.putExtra("outputY",150);intent.putExtra("return-data",true);//裁剪之后的数据是通过intent返回回来的startActivityForResult(intent,CROP_REQUEST_CODE);}

该方法是在使用摄像头拍摄照片和从图库中选择照片后调用的,这里从新粘贴一下onActivityResult回调方法

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == CAMERA_REQUEST_CODE) {//判断用户点击了拍照还是取消,如果是取消的话就不用进行数据的处理if (data == null) {return;} else {Bundle extras = data.getExtras();if (extras != null) {//创建Bitmap用于保存用户拍照的数据Bitmap bm = extras.getParcelable("data");/*ImageView imageView = (ImageView) findViewById(R.id.imageView);imageView.setImageBitmap(bm);*/Uri uri = saveBitmap(bm);startImageZoom(uri);}}}else if(requestCode == GALLERY_REQUEST_CODE){if(data == null){return;}//当使用这种方法打开图库并选择一张照片后返回后onActivityResult方法中的data参数将会包含一个uri(就是选择图片所对应的uri统一资源标识符)Uri uri;uri = data.getData();//获取该uri,注:在Android中常用的uri有两种一种是以content开头的另一种是以file开头的,那么从图库中获取的uri到底是哪种类型的uri呢?//Toast.makeText(MainActivity.this,uri.toString(),Toast.LENGTH_LONG).show();//content类型的,对于content类型的uri不能直接对他进行复制的操作Uri fileUri = convertUri(uri);//转换为file类型的uristartImageZoom(fileUri);}//判断是否从图像裁剪界面返回else if (requestCode == CROP_REQUEST_CODE) {if (data == null) {//判断用户点击的是保存还是取消return;}Bundle extras = data.getExtras();Bitmap bm = extras.getParcelable("data");ImageView imageView = (ImageView) findViewById(R.id.imageView);imageView.setImageBitmap(bm);}}

图像上传并在服务器保存图像

本课时的主要内容如下:

  • 讲解AsyncHttpClient库的使用
  • 讲解Base64编码的编码与解码
  • 讲解在服务器上使用PHP保存文件

AsyncHttpClient 第三方开源类库
https://github.com/loopj/android-async-http/
他是针对android开发中发送http请求的
下载后将里面的jar包拷贝到项目的libs中然后右键Add As Library… (Android sutdio),这样就完成了这个库添加

添加一个新的方法用来发送图像数据

//添加一个新的方法用来发送图像数据//将Bitmap的数据发送到指定的服务器private void sendImage(Bitmap bm){//转换为byte数组类型ByteArrayOutputStream stream = new ByteArrayOutputStream();bm.compress(Bitmap.CompressFormat.PNG,60,stream);byte[] bytes = stream.toByteArray();//将这个数组编码成Base64编码的数据把他发送给服务器String img = new String(Base64.encodeToString(bytes,Base64.DEFAULT));//将string类型的数据发送到服务器在服务器端通过Base64解码得到图像的原始数据AsyncHttpClient client =  new AsyncHttpClient();RequestParams params = new RequestParams();//该对象用于保存要传输的参数params.add("img",img);client.post("http://192.168.56.1/ImgUpload.php", params, new AsyncHttpResponseHandler() {@Overridepublic void onSuccess(int i, Header[] headers, byte[] bytes) {Toast.makeText(MainActivity.this, "Upload Success!", Toast.LENGTH_LONG).show();}@Overridepublic void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {Toast.makeText(MainActivity.this, "Upload Fail!", Toast.LENGTH_LONG).show();}});}

在图像裁剪完之后调用这个方法,要访问网络还需要添加网络访问权限

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

Android 头像上传相关推荐

  1. Android头像上传实战模拟

    Android头像上传实战模拟 在开发中头像的上传应该是必不可少的,话不多说上效果图! 点击头像弹出PopupWindow分别三个按钮. <?xml version="1.0" ...

  2. Android 头像上传的实现

    当我们点击头像想要进行头像上传时,我们可以给上传头像设置一个弹框效果,用来给用户提供相册选择和拍照两种选择. 这时我们可以使用PopupWindow实现 1. 定义图片存储位置 public void ...

  3. Android头像上传--图片转base64,后台接收到的总是null问题

    图片转base64,后台接到为null问题 项目中,在使用头像上传的时候,将图片转为base64,后台总是收到的base64字符串是null.原以为是图片未压缩,导致图片过大,超过了Tomcat配置的 ...

  4. Android 头像上传

    第一步:权限和依赖 <uses-permission android:name="android.permission.INTERNET" /><uses-per ...

  5. Android头像上传时裁剪图片过大问题,裁剪大图片导致

    原先在完成头像上传功能的时候复制网上写好的代码,虽然也仔细研究过实现的过程但是这次项目中却遇到了一个很不解的问题,使用乐视手机实现图片裁剪的那一步骤中由于图片太大手机性能不够导致图片无法裁剪报出错误 ...

  6. 调用android的拍照或本地相册选取再实现相片上传服务器,Android调用系统相机、本地相册上传图片(头像上传(裁剪)、多张图片上传)...

    开发中基本上都会有头像上传的功能,有的app还需要多张图片同时上传,下面简单将头像上传以及多张图片上传功能整理一下.图片选择仿照微信选择图片的界面.[参考] 多图片选择器 !!!推荐一个动态权限请求的 ...

  7. Android kotlin上传头像实现

    Android 上传头像基本上是每个app都有的功能,虽然看起来简单,但是作为新手的我实现起来却没有那么简单,实现如下 从相册获取照片,代码如下 //从相册获取照片private fun getFro ...

  8. android自定义头像上传,android裁切图片之用于头像上传

    嘛话都不说,直接贴代码,也是在网上找的代码copy出来的! 页面代码 encoding="utf-8"?> android:orientation="vertica ...

  9. android 华为裁剪全图,华为手机头像上传裁剪操作 报错

    华为手机头像上传操作, 裁剪点存储--进入裁剪后--点确定, 就直接报错退出程序了,其他机型测都是成功的,求大神指教 报错代码 @Override protected void onActivityR ...

最新文章

  1. ApacheCommons的Java公共类库(实现如Log这些功能)
  2. SAP复合角色更改后扩展到派生节点
  3. 若依前后端分离版本,Windows下使用Nginx代理的方式进行部署(全流程,图文教程)
  4. Maven 搭建spring boot多模块项目(附源码)
  5. 3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你
  6. 林俊卿咽音练声法八个步骤(纯净版视频加图文)(转)
  7. EventBridge 事件总线及 EDA 架构解析
  8. [转载] Python新手写出漂亮的爬虫代码1——从html获取信息
  9. HDC2020开发者大会鸿蒙,鸿蒙2.0来了!华为开发者大会HDC 2020宣布
  10. B - C语言实验——整数位
  11. 【Vue2.0】—默认插槽、具名插槽、作用域插槽(二十四)
  12. Asp.net 邮件传输
  13. 如何:写入文本文件(C# 编程指南)
  14. 零基础Python知识点回顾(三)
  15. PRML Chapter01 练习题Exercise
  16. ios、android、h5、小程序等安卓苹果平台终端兼容问题
  17. python图片查看器
  18. 计算机组成原理 或的微指令,微指令
  19. 签到java小程序代码_微信小程序全栈项目:签到打卡小程序 + 后端实现
  20. 选择私有云解决方案,需要考虑哪些要素

热门文章

  1. pagination分页、jedate日期、wangEditor富文本插件使用总结
  2. 【谷歌浏览器升级之后,导致在谷歌浏览器上面无法正常访问政务网的解决办法】
  3. 区块链创新之路,该何去何从?
  4. id nil Nil SET IMP 等概念
  5. 【PCB开源分享】STC8A8K64D4开发板
  6. FFMPEG API函数根据SDP文件接收RTP媒体流
  7. 使用AWS 管理控制台和 AWS CLI创建EKS集群
  8. python猫眼电影分析_用Python 爬取猫眼电影数据分析《无名之辈》
  9. 计算机网络中WLAN是指,什么是wlan网络,WLAN是什么意思?
  10. chrome 插件 导出与导入,以apizza SQ为例