【kotlin】选择本地音频并上传 / 上传文件

启动选择音频页

	 private var mCurrentAudioUrl: String? = null  // 当前选择的音频文件
	 private var audioFilePath: String? = null; // 文件路径

	val intent =Intent(Intent.ACTION_GET_CONTENT, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI)
	intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
	intent.setDataAndType(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, "audio/*") // 视频换成对应类型
	try {
	   if (mAudioPlayServerBinder!!.isPlaying()) { // 播放音频组件是否在播放
	       mAudioPlayServerBinder!!.pausePlay()
	       binding.playButton.setImageResource(R.drawable.icon_black_play)
	    }
	    startActivityForResult(intent, mSelectAudioRequest)
	} catch (e: Exception) {}

监听音频选择结果

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == mSelectAudioRequest && resultCode == RESULT_OK) {
            if (data !== null) {
                audioFilePath = getFilePath(this, data.data!!) // 文件路径
                if (!MediaFileTypeUtil().isAudioFileType(audioFilePath.toString())) {
                    ToastUtils.showToast("请选择音频文件", 500)
                    return
                }
                mCurrentAudioUrl = data.data.toString()
                mCurrentAudio = object : AudioEntity { // 音频对象
                    override val audioUrl: String
                        get() = mCurrentAudioUrl!!
                    override val audioId: String
                        get() = ""
                }
            }
        }
    }
    
    // 将文件规范==》获取文件路径
    fun getFilePath(context: Context, uri: Uri): String? {
        try {
            val returnCursor: Cursor? =
                context.getContentResolver().query(uri, null, null, null, null)
            val nameIndex: Int = returnCursor!!.getColumnIndex(OpenableColumns.DISPLAY_NAME)
            returnCursor.moveToFirst()
            val name: String = returnCursor.getString(nameIndex)
            val file = File(context.getFilesDir(), name)
            val inputStream: InputStream? = context.getContentResolver().openInputStream(uri)
            val outputStream = FileOutputStream(file)
            var read = 0
            val maxBufferSize = 1 * 1024 * 1024
            val bytesAvailable: Int = inputStream!!.available()
            val bufferSize = Math.min(bytesAvailable, maxBufferSize)
            val buffers = ByteArray(bufferSize)
            while (inputStream!!.read(buffers).also { read = it } != -1) {
                outputStream.write(buffers, 0, read)
            }
            returnCursor.close()
            inputStream.close()
            outputStream.close()
            return file.getPath()
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return null
    }

上传文件

	fun uploadFile(){
	if (!TextUtils.isEmpty(mCurrentAudioUrl)) { // 判断是否为空
            val audioFile = File(audioFilePath!!) // 创建file
            val typeArr = audioFilePath!!.split(".") // 获取file 音频类型
            val mediaType = typeArr[typeArr.size - 1]
            // 音频文件body===》 视频类型为"video/${mediaType}".toMediaTypeOrNull()
            val fileBody = RequestBody.create(
	            "audio/${mediaType}".toMediaTypeOrNull(), 
	            audioFile
	        )
	        // 添加参数
            val builder = MultipartBody.Builder().setType(MultipartBody.FORM)
                .addFormDataPart("fileType", "2") // 参数
                .addFormDataPart(
                    "videoName",
                    "${UserUtil.mUserInfo?.currentUser?.userId}0_${TimeUtils.getNowSecond()}"
                )
                .addFormDataPart("file", audioFilePath!!,fileBody)
				.addFormDataPart(
					"title",
					"${UserUtil.mUserInfo?.currentUser?.userId}0_${TimeUtils.getNowSecond()}"
				)
          		.addFormDataPart("description",binding.inputContent.text.toString())
            val body: RequestBody = builder.build()
            val service = ApiManager.initService(InteractionService::class.java, body) // 封装的初始化请求方法

			// 封装的请求方法
            ApiManager.request(
                lifecycleScope,
                service.uploadVideoAsync(),
                this,
                isShowDialog = true,
                fail = {}
            ) {
                if (it?.code == 200) {}
            }
        }
	}

上传文件接口

    @POST("url")
    fun uploadVideoAsync() : Deferred<Response<BaseResponse<Any>>>

踩雷记录

  1. formData类型接口不能再写uploadVideoAsync(@Body map: Map<String,Any),可以写uploadVideoAsync(@QueryMap map:Map<String,Any>)
  2. 加入formData传参可以链式调用addFormDataPart(key, value)
  3. 传入文件的是addFormDataPart(key, fileName, requestBody)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值