Android 上传头像基本上是每个app都有的功能,虽然看起来简单,但是作为新手的我实现起来却没有那么简单,实现如下

  1. 从相册获取照片,代码如下
  //从相册获取照片private fun getFromAlbum() {val intent = Intent()intent.action = Intent.ACTION_GET_CONTENTintent.type = "image/*"startActivityForResult(intent, FROM_ALBUM_SUCCEED)}

2.拍照获取照片

//拍照获取照片@SuppressLint("SimpleDateFormat")private fun takePhotoTest() {val intent2 = Intent(MediaStore.ACTION_IMAGE_CAPTURE)val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())val imageFileName = "JPEG_$timeStamp"val file = File(Environment.getExternalStorageDirectory().path, "${imageFileName}.jpg")cameraImagePath = file.pathval uri: Uriuri = if (Build.VERSION.SDK_INT >= 24) {FileProvider.getUriForFile(context!!, "com.wayeal.wateraffair.user.fileprovider", file)} else {Uri.fromFile(file)}camearImageUri = uriintent2.putExtra(MediaStore.EXTRA_OUTPUT, uri)startActivityForResult(intent2, CODE_TAKE_PHOTO)}

其中camearImageUri为拍照图片的uri
cameraImagePath为拍照图片的路径
在拍照过程中用到了fileprovider,如果对这一部分不了解的可以了解一下
3.在AndroidManifest.xml中添加下列语句

 <providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.wayeal.wateraffair.user.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>

以上拍照和在相册获取照片就解决了,但是我们是拍照了,但是获取的图片在哪呢,不要急重写下列函数,获取结果

override  fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)when (requestCode) {FROM_ALBUM_SUCCEED -> {//从相册获取成功try {imageUri = data?.datarealPathFromUri = RealPathFromUriUtils.getRealPathFromUri(context, imageUri)upImage(FROM_ALBUM)//这里实现文件上传服务器,如不需要可以直接设置显示} catch (e: Exception) {e.printStackTrace()}}CODE_TAKE_PHOTO -> {//拍照获取成功upImage(FROM_PHOTO)//这里实现文件上传服务器,如不需要可以直接设置显示if (resultCode == RESULT_CANCELED) {context?.let { delteImageUri(it, imageUri) }return}}else -> {}}}

在上传服务器是会出现文件找不到问题
在AndroidManifest.xml的application中添加下列语句

android:usesCleartextTraffic="true"

这样一个简单的上传头像就做完了
如果在上传服务器时由于图片太大而上传太慢,还可以进行图片压缩代码如下

/*** 压缩图片到目标大小以下* @param file* @param targetSize*/open fun compressBmpFileToTargetSize(file: File, targetSize: Long) {Log.d(TAG,String.format("compressBmpFileToTargetSize start file.length():%d",file.length()))if (file.length() > targetSize) {// 每次宽高各缩小一半val ratio = 2// 获取图片原始宽高val options =BitmapFactory.Options()val bitmap =BitmapFactory.decodeFile(file.absolutePath, options)var targetWidth = options.outWidth / ratiovar targetHeight = options.outHeight / ratio// 压缩图片到对应尺寸val baos = ByteArrayOutputStream()val quality = 100var result =generateScaledBmp(bitmap, targetWidth, targetHeight, baos, quality)// 计数保护,防止次数太多太耗时。var count = 0while (baos.size() > targetSize && count <= 10) {targetWidth /= ratiotargetHeight /= ratiocount++// 重置,不然会累加baos.reset()result = generateScaledBmp(result, targetWidth, targetHeight, baos, quality)}try {val fos = FileOutputStream(file)fos.write(baos.toByteArray())fos.flush()fos.close()} catch (e: java.lang.Exception) {e.printStackTrace()}}Log.d(TAG,String.format("compressBmpFileToTargetSize end file.length():%d", file.length()))}/*** 图片缩小一半** @param srcBmp* @param targetWidth* @param targetHeight* @param baos* @param quality* @return*/private fun generateScaledBmp(srcBmp: Bitmap,targetWidth: Int,targetHeight: Int,baos: ByteArrayOutputStream,quality: Int): Bitmap {val result = Bitmap.createBitmap(targetWidth,targetHeight,Bitmap.Config.ARGB_8888)val canvas = Canvas(result)val rect = Rect(0, 0, result.width, result.height)canvas.drawBitmap(srcBmp, null, rect, null)if (!srcBmp.isRecycled) {srcBmp.recycle()}result.compress(Bitmap.CompressFormat.JPEG, quality, baos)return result}

这样就完成了简单的头像上传,小白记录学习日常,如有不对请指正

Android kotlin上传头像实现相关推荐

  1. android mysql上传头像,Android自定义控件仿QQ编辑和选取圆形头像

    android大家都有很多需要用户上传头像的需求,有的是选方形,有的是圆角矩形,有的是圆形. 首先我们要做一个处理图片的自定义控件,把传入的图片,经过用户选择区域,处理成一定的形状. 有的app是通过 ...

  2. android kotlin 上传文件 上传图片

    kotlin 上传图片 首先要引入retrofig2 implementation 'com.squareup.retrofit2:retrofit:2.4.0'implementation 'com ...

  3. Android上传头像,图片剪裁,压缩图片

    点击头像的时候开始调用camera()方法 private byte[] mContent = new byte[1024];// 保存照片转换后的字节,用与上传到服务器private Bitmap ...

  4. Android 上传头像自定义(剪切、平移,缩放)

    点击进入下载源码 今天是愚人节,但是我发表的内容可不是用来愚人的.上传图片时很多应用的硬需求,我们的应用也不例外.以前上传头像时感觉是那样的so-easy,但是前几天的上传图片让我很是头疼.原本的上传 ...

  5. Android 仿qq上传头像(一)

           转载请注明出处http://blog.csdn.net/u014163726/article/details/44994197        这么长时间没写博客感觉手都要生了啊,最近因为 ...

  6. android修改头像以及上传头像

    实际开发中的功能,本地选择图片或者拍照,然后裁剪作为头像,这里做一下总结. 直接看demo效果图:             源码地址:https://download.csdn.net/downloa ...

  7. android 模仿qq 上传头像,Android 仿qq上传头像(一)

    转载请注明出处http://blog.csdn.net/u014163726/article/details/44994197 这么长时间没写博客感觉手都要生了啊,最近因为工作的关系来到了上海,目前还 ...

  8. android开发之上传头像

    一.调起相机 所需权限有:相机权限(android.permission.CAMERA),文件存取权限(android.permission.WRITE_EXTERNAL_STORAGE.androi ...

  9. 高仿微信上传头像附带压缩,旋转图片,附加demo

    本人初学者,再做项目时要求上传头像要像微信那种,需要外面裁剪框不动,里面图片可以改变大小,android系统裁剪和所要求的完全相反,所以,对于这个问题,困扰了我将近一个月,不断的修改,不断的出现新问题 ...

最新文章

  1. 提高C++性能的编程技术笔记:标准模板库+测试代码
  2. PHP协程:并发 shell_exec
  3. http://bbs.phome.net/showthread-13-45519-0.html
  4. R语言ggplot2可视化为长文本轴标签自动换行美化可视化结构实战:Wrap long text axis labels
  5. clover写入efi_2014 黑苹果折腾之clover efi全新安装
  6. 思源高拍仪万能驱动_动态展示和教学 良田YL1050AF高拍仪评测
  7. java正则表达式 ascii,是否可以检查字符串是否在Java中仅包含ASCII?
  8. 后天的太阳——马云论坚持
  9. CMake使用介绍(1)
  10. pytorch图像检索评价指标MAP
  11. “我培训完JAVA,进了美团,美团氛围特别好,就是送餐特别累”
  12. Android开发环境搭建笔记总结
  13. 禁用驱动数字签名验证
  14. word论文排版插件_Word排插件 一键搞定论文、标书、报告、公文等排版
  15. python获取本机IP
  16. python,matlab 读取NIFTI(.nii)格式图像、FSL安装
  17. hdu 5745 La Vie en rose 2016多校第二场1012
  18. 2018的趋势与展望(下)——记罗振宇“时间的朋友2017”跨年演讲
  19. WinEdt10.3 激活
  20. 添加企业微信免验证设置

热门文章

  1. Streamlit(五) widgets-button
  2. uniapp 实现验证码输入框
  3. 线性代数-初等行变换与初等行矩阵
  4. java中的逻辑结构
  5. User Agent
  6. Python爬虫底层知识简介 - AI小白进阶之路
  7. 我参加NVIDIA Sky Hackathon(语音识别模型训练)
  8. LSTM 长短期记忆
  9. UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initial
  10. Cocos Creator 3D 粒子系统初战(一),不要钱的酷炫火焰拿走不谢!