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

  1. 从相册获取照片,代码如下
  //从相册获取照片    private fun getFromAlbum() {        val intent = Intent()        intent.action = Intent.ACTION_GET_CONTENT        intent.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.path        val uri: Uri        uri = if (Build.VERSION.SDK_INT >= 24) {            FileProvider.getUriForFile(context!!, "com.wayeal.wateraffair.user.fileprovider", file)        } else {            Uri.fromFile(file)        }        camearImageUri = uri        intent2.putExtra(MediaStore.EXTRA_OUTPUT, uri)        startActivityForResult(intent2, CODE_TAKE_PHOTO)    }

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

 <provider            android:name="androidx.core.content.FileProvider"            android:authorities="com.wayeal.wateraffair.user.fileprovider"            android:exported="false"            android:grantUriPermissions="true">            <meta-data                android: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?.data                        realPathFromUri = 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 / ratio            var targetHeight = options.outHeight / ratio            // 压缩图片到对应尺寸            val baos = ByteArrayOutputStream()            val quality = 100            var result =                generateScaledBmp(bitmap, targetWidth, targetHeight, baos, quality)            // 计数保护,防止次数太多太耗时。            var count = 0            while (baos.size() > targetSize && count <= 10) {                targetWidth /= ratio                targetHeight /= ratio                count++                // 重置,不然会累加                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    }

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

更多相关文章

  1. Android之UI学习篇七:ImageView实现适屏和裁剪图片的功能
  2. 第一次写博客,先上传一下平常开发android的时候做的一点笔记
  3. android中从图库中选取图片
  4. Android使用libjpeg实现图片压缩
  5. android访问网络,下载图片,并设置UI
  6. Android Retrofit与Spring后台配合,实现单张、多张图片上传功能
  7. Android 强大的图片加载缓存— Glide
  8. 让 Android 可以识别BMP图片文件,且目前Android所支持的所有图片

随机推荐

  1. 【Android】AS环境下,在布局中使用android
  2. 【Android开发】Android入门安装与使用教
  3. App for Android (2) —— Python篇
  4. Android中的Toast的标准格式和自定义格式
  5. EditText属性及一些常用用法
  6. 【Android性能优化】使用NDK进行Java和C+
  7. 一文彻底搞懂Android(安卓)View的绘制流
  8. AIDL(android 接口描述语言)
  9. 用Eclipse开发和调试Android应用程序(一)
  10. Android的电源管理