Kotlin语音录制上传Firebase同名覆盖问题的解决咨询
解决Firebase语音录制文件被覆盖的问题
嘿,这个问题很好解决,核心就是你现在不管录多少次,本地存储和Firebase用的都是固定文件名,自然每次都会覆盖旧文件。只要给每次录制的音频生成独一无二的文件名,就能完美搞定啦!
我给你两种简单可靠的实现方式,选哪种都可以:
方法一:用时间戳生成唯一文件名
时间戳是当前系统的毫秒数,每次录制的时间肯定不一样,生成的文件名绝对不会重复,还能直观看到录制时间。
1. 修改本地文件名生成逻辑
把原来固定的recorded_audio.3gp改成带时间戳的文件名,最好把这部分逻辑放到startRecording()方法里,确保每次录制都生成新文件名:
private fun startRecording() { // 每次录制前生成新的唯一文件名 val timestamp = System.currentTimeMillis() mFileName = externalCacheDir!!.absolutePath mFileName += "/recorded_audio_$timestamp.3gp" mRecorder = MediaRecorder() mRecorder!!.setAudioSource(MediaRecorder.AudioSource.MIC) mRecorder!!.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP) mRecorder!!.setOutputFile(mFileName) mRecorder!!.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB) try { mRecorder!!.prepare() } catch (e: IOException) { Log.e(LOG_TAG, "prepare() failed") } mRecorder!!.start() }
2. 修改Firebase上传的文件名
上传的时候直接用本地生成的唯一文件名,这样Firebase里也不会出现覆盖问题:
private fun uploadAudio() { // 获取本地文件的唯一文件名 val audioFileName = File(mFileName!!).name val filepath = mStorage!!.child("Audio").child(audioFileName) val uri = Uri.fromFile(File(mFileName!!)) filepath.putFile(uri) .addOnSuccessListener { Log.d(LOG_TAG, "音频上传成功!") } .addOnFailureListener { e -> Log.e(LOG_TAG, "音频上传失败", e) } }
方法二:用UUID生成唯一文件名
UUID是全球唯一的标识符,生成的文件名完全不会重复,适合对唯一性要求极高的场景:
1. 修改本地文件名
private fun startRecording() { // 生成唯一UUID作为文件名的一部分 val uniqueId = UUID.randomUUID().toString() mFileName = externalCacheDir!!.absolutePath mFileName += "/recorded_audio_$uniqueId.3gp" // 下面的MediaRecorder初始化逻辑不变 mRecorder = MediaRecorder() mRecorder!!.setAudioSource(MediaRecorder.AudioSource.MIC) mRecorder!!.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP) mRecorder!!.setOutputFile(mFileName) mRecorder!!.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB) try { mRecorder!!.prepare() } catch (e: IOException) { Log.e(LOG_TAG, "prepare() failed") } mRecorder!!.start() }
2. Firebase上传逻辑和方法一一致
同样用File(mFileName!!).name获取唯一文件名上传即可。
额外小提醒
- 别把
mFileName的初始化放在方法外面,不然多次录制会复用同一个文件名,一定要放到startRecording()里每次重新生成。 - 可以在上传成功的回调里加个Toast提示用户,比如
Toast.makeText(this, "音频上传完成", Toast.LENGTH_SHORT).show(),提升用户体验。
内容的提问来源于stack exchange,提问作者Ceridoglu
相关产品推荐
相关产品推荐

