📌  相关文章
📜  使用 Jetpack Compose 在 Android 中播放音频(1)

📅  最后修改于: 2023-12-03 14:49:41.862000             🧑  作者: Mango

使用 Jetpack Compose 在 Android 中播放音频

在 Android 中播放音频是一个常见的需求。在 Jetpack Compose 中,可以使用 MediaPlayer 实现音频的播放和控制。本文将介绍如何在 Jetpack Compose 应用中使用 MediaPlayer 播放音频,包括实现播放、暂停、停止和控制进度。

准备工作

首先,需要在应用的 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这些权限可以允许应用读取和写入外部存储器上的音频文件。

播放音频文件

通过以下代码可以实现播放音频文件:

import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalContext
import androidx.core.net.toUri

import android.media.MediaPlayer
import kotlinx.coroutines.*

/**
 * 播放指定路径下的音频文件
 *
 * @param filePath 音频文件路径
 * @param onCompletion 回调函数,播放完成时调用
 */
fun playAudio(filePath: String, onCompletion: () -> Unit) {
    val mediaPlayer = MediaPlayer()
    mediaPlayer.setDataSource(LocalContext.current, filePath.toUri())
    mediaPlayer.setOnCompletionListener {
        onCompletion()
        mediaPlayer.release()
    }
    mediaPlayer.prepare()
    mediaPlayer.start()
}

playAudio 函数中,我们创建了一个 MediaPlayer 实例,并为它设置音频文件路径和完成时回调函数。然后我们调用 prepare()start() 方法开始播放音频。

为了保持应用的响应性,建议使用 CoroutineplayAudio 函数的调用置于后台线程中。

暂停和恢复音频播放

使用以下代码可以实现暂停和恢复音频播放:

fun pauseAudio() {
    mediaPlayer?.apply {
        if (isPlaying) {
            pause()
        }
    }
}

fun resumeAudio() {
    mediaPlayer?.apply {
        if (!isPlaying) {
            start()
        }
    }
}

pauseAudio 函数中,我们检查 MediaPlayer 是否在播放状态,如果是,则调用 pause() 方法暂停播放。

resumeAudio 函数中,我们检查 MediaPlayer 是否在非播放状态,如果是,则调用 start() 方法恢复播放。

停止和重置音频播放

使用以下代码可以实现停止和重置音频播放:

fun stopAudio() {
    mediaPlayer?.apply {
        stop()
        reset()
        release()
    }
    mediaPlayer = null
}

stopAudio 函数中,我们调用 stop() 方法停止正在播放的音频,然后调用 reset() 方法将 MediaPlayer 返回到初始状态。最后调用 release() 释放资源。

控制音频进度

使用以下代码可以实现控制音频进度:

fun setAudioProgress(progress: Int) {
    mediaPlayer?.apply {
        seekTo(progress)
    }
}

@Composable
fun AudioPlayer() {
    var playing by remember { mutableStateOf(false) }
    var progress by remember { mutableStateOf(0) }

    LaunchedEffect(playing) {
        if (playing) {
            playAudio(filePath) {
                playing = false
            }
        } else {
            pauseAudio()
        }
    }

    Column {
        // TODO: Add audio control buttons and progress bar
    }
}

AudioPlayer 组件中,我们使用 rememberLaunchedEffect 将音频播放操作置于后台线程中,用布尔值 playing 和整数值 progress 来记录播放状态和进度值。

然后,在组件中添加音频控制按钮和进度条即可实现对音频的实时控制。

结论

在 Jetpack Compose 应用中使用 MediaPlayer 播放音频是一项非常简单的任务。本文介绍了如何使用 MediaPlayer 实现音频的播放、暂停、停止和控制进度,希望对大家有所帮助。