fix: Properly save concatenated files

This commit is contained in:
Myzel394 2023-08-05 20:46:52 +02:00
parent 9a43afbe3e
commit 0b9bb48fdc
No known key found for this signature in database
GPG Key ID: 79CC92F37B3E1A2B
4 changed files with 27 additions and 12 deletions

View File

@ -30,6 +30,7 @@ import java.io.File
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.time.format.DateTimeFormatter.ISO_DATE_TIME
import java.util.Date
import java.util.UUID
@ -100,10 +101,15 @@ class RecorderService: Service() {
fun concatenateFiles(forceConcatenation: Boolean = false): File {
val paths = filePaths.joinToString("|")
val outputFile = "$fileFolder/${recordingStart!!.format(DateTimeFormatter.ISO_DATE_TIME)}.${settings.fileExtension}"
val fileName = recordingStart!!
.format(DateTimeFormatter.ISO_DATE_TIME)
.toString()
.replace(":", "-")
.replace(".", "_")
val outputFile = File("$fileFolder/$fileName.${settings.fileExtension}")
if (File(outputFile).exists() && !forceConcatenation) {
return File(outputFile)
if (outputFile.exists() && !forceConcatenation) {
return outputFile
}
val command = "-i \"concat:$paths\" -acodec copy $outputFile"
@ -124,7 +130,7 @@ class RecorderService: Service() {
throw Exception("Failed to concatenate audios")
}
return File(outputFile)
return outputFile
}
private fun updateAmplitude() {

View File

@ -44,6 +44,7 @@ import app.myzel394.locationtest.ui.components.atoms.Pulsating
import app.myzel394.locationtest.ui.utils.formatDuration
import app.myzel394.locationtest.ui.utils.rememberFileSaverDialog
import kotlinx.coroutines.delay
import java.io.File
import java.time.Duration
import java.time.LocalDateTime
import java.time.ZoneId
@ -51,9 +52,9 @@ import java.time.ZoneId
@Composable
fun RecordingStatus(
service: RecorderService,
saveFile: (File) -> Unit,
) {
val context = LocalContext.current
val saveFile = rememberFileSaverDialog("audio/*")
var now by remember { mutableStateOf(LocalDateTime.now()) }

View File

@ -45,6 +45,7 @@ import app.myzel394.locationtest.services.RecorderService
import app.myzel394.locationtest.ui.components.AudioRecorder.atoms.RecordingStatus
import app.myzel394.locationtest.ui.components.AudioRecorder.atoms.StartRecording
import app.myzel394.locationtest.ui.enums.Screen
import app.myzel394.locationtest.ui.utils.rememberFileSaverDialog
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@ -53,6 +54,7 @@ fun AudioRecorder(
) {
val context = LocalContext.current
val saveFile = rememberFileSaverDialog("audio/aac")
var service by remember { mutableStateOf<RecorderService?>(null) }
val connection = remember {
object : ServiceConnection {
@ -78,7 +80,7 @@ fun AudioRecorder(
topBar = {
TopAppBar(
title = {
Text(text = "Audio Recorder")
Text("Alibi")
},
actions = {
IconButton(
@ -101,7 +103,7 @@ fun AudioRecorder(
.padding(padding),
) {
if (isRecording && service != null)
RecordingStatus(service = service!!)
RecordingStatus(service = service!!, saveFile = saveFile)
else
StartRecording(connection = connection, service = service)
}

View File

@ -3,6 +3,8 @@ package app.myzel394.locationtest.ui.utils
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import java.io.File
@ -10,22 +12,26 @@ import java.io.File
fun rememberFileSaverDialog(mimeType: String): ((File) -> Unit) {
val context = LocalContext.current
var file: File? = null
var file = remember { mutableStateOf<File?>(null) }
val launcher = rememberLauncherForActivityResult(contract = ActivityResultContracts.CreateDocument(mimeType)) {
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument(mimeType)) {
println("file")
println(file)
it?.let {
context.contentResolver.openOutputStream(it)?.use { outputStream ->
file!!.inputStream().use { inputStream ->
file.value!!.inputStream().use { inputStream ->
inputStream.copyTo(outputStream)
}
}
}
file = null
file.value = null
}
return {
file = it
println("eich")
println(it)
file.value = it
launcher.launch(it.name)
}
}