android11使用okttp上传相册图片

引入okhttp库

implementation ("com.squareup.okhttp3:okhttp:4.9.0")

代码

class UploadImgActivity : AppCompatActivity() {
    lateinit var binding:ActivityUploadImgBinding
    companion object{
        const val FROM_ALBUM = 1
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUploadImgBinding.inflate(layoutInflater)
        setContentView(binding.root)
        initView()
    }

    private fun initView() {
        binding.btUploadImg.setOnClickListener {
            val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
            intent.addCategory(Intent.CATEGORY_OPENABLE)
            intent.type = "image/*"
            startActivityForResult(intent, FROM_ALBUM)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            FROM_ALBUM -> {
                if (resultCode == Activity.RESULT_OK && data != null) {
                    val selectedPhotoUri = data.data
                    selectedPhotoUri?.let {
                        uploadImg(it)
                    }

                }
            }
        }
    }
    //使用okhttp上传图片
    private fun uploadImg(uri: Uri) = try{
        val okhttpClient = OkHttpClient()
        val builder = MultipartBody.Builder()
            .setType(MultipartBody.FORM)
        val file = uri.toFile(this)
        file?.let{
            builder.addFormDataPart(
                "file",
                it.name,
                it.asRequestBody("multipart/form-data;charset=utf-8".toMediaTypeOrNull())
            )
        }
        val body = builder.build()
        val request = Request.Builder().url("http://www.httpbin.org/post").post(body).build()
        okhttpClient.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {

            }

            override fun onResponse(call: Call, response: Response) {
                println("responseBody${response.body?.string()}")
            }

        })

    }catch (e: Exception){

    }
}

xml文件

      布局文件只有一个button,就不写了。

Uri.toFile方法

 fun Uri.toFile(context: Context): File? = when (scheme) {
        ContentResolver.SCHEME_FILE -> toFile()
        ContentResolver.SCHEME_CONTENT -> {
            val columns = arrayOf(MediaStore.Images.ImageColumns.DISPLAY_NAME)
            val cursor = context.contentResolver.query(this, columns, null, null, null)
            val file = cursor?.use {
                if (it.moveToFirst()) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        val ois = context.contentResolver.openInputStream(this)
                        val displayName = it.getString(it.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME))
                        ois?.use { ois ->
                            val file = File(
                                context.externalCacheDir,
                                "new$displayName"
                            )
                            if(file.exists()){
                                file.delete()
                            }
                            file.createNewFile()
                            val fos = FileOutputStream(file)
                            ois.copyTo(fos)
                            fos.close()
                            file
                        }
                    } else
                        File(it.getString(it.getColumnIndex(MediaStore.Images.Media.DATA)))
                } else null
            }
            file
        }
        else -> null
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方(~ ̄▽ ̄)~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值