为了使用 Kotlin 的 Jetpack Compose 来开发一个安卓应用,你可以用 OkHttp 下载远程音频文件,然后用 ExoPlayer 来播放它们。下面是一个基本的示例代码,希望能帮到你。
首先,你需要在 build.gradle
文件中添加必要的依赖项。
dependencies { // Jetpack Compose implementation "androidx.compose.ui:ui:1.0.0" implementation "androidx.compose.material:material:1.0.0" implementation "androidx.compose.ui:ui-tooling-preview:1.0.0" // OkHttp implementation "com.squareup.okhttp3:okhttp:4.9.2" // ExoPlayer implementation 'com.google.android.exoplayer:exoplayer:2.14.1' }
接下来示例代码展示了如何使用 OkHttp 下载远程音频文件以及如何使用 ExoPlayer 播放它。
import android.content.Context import android.net.Uri import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.launchedEffect import androidx.compose.ui.tooling.preview.Preview import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberPermissionState import com.google.accompanist.permissions.MultiplePermissionsState import com.google.accompanist.permissions.rememberMultiplePermissionsState import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import okhttp3.OkHttpClient import okhttp3.Request import java.io.File import kotlin.concurrent.thread class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MaterialTheme { MyApp(this) } } } } fun MyApp(context: Context) { val audioUrl = "https://example.com/path/to/your/audiofile.mp3" val downloadedFile = File(context.cacheDir, "downloaded.mp3") // Permissions handling (Optional, if your file needs special storage permissions) val context = LocalContext.current val permissionsState = rememberMultiplePermissionsState(listOf( android.Manifest.permission.INTERNET, android.Manifest.permission.WRITE_EXTERNAL_STORAGE )) if (permissionsState.allPermissionsGranted) { DownloadAndPlayAudio(context, audioUrl, downloadedFile) } else { permissionsState.launchMultiplePermissionRequest() } } fun DownloadAndPlayAudio(context: Context, url: String, file: File) { launchedEffect(url) { thread { val client = OkHttpClient() val request = Request.Builder().url(url).build() client.newCall(request).execute().use { response -> if (response.isSuccessful) { response.body?.byteStream()?.use { input -> file.outputStream().use { output -> input.copyTo(output) } } playAudio(context, Uri.fromFile(file)) } } } } Text("Downloading and playing...") } fun playAudio(context: Context, uri: Uri) { val player = ExoPlayer.Builder(context).build() val mediaItem = MediaItem.fromUri(uri) player.setMediaItem(mediaItem) player.prepare() player.playWhenReady = true } showBackground = true) ( fun DefaultPreview() { MaterialTheme { Text("Hello Android!") } }
这个示例代码包含的主要部分如下:
- 依赖项添加:在
build.gradle
中添加 OkHttp 和 ExoPlayer 的依赖项。 - 下载音频文件:使用 OkHttp 下载远程的音频文件,并保存到本地的缓存目录。
- 播放音频文件:使用 ExoPlayer 播放下载好的音频文件。
- Jetpack Compose:使用简单的 Compose UI 显示当前状态。
注意:在这个示例中没有做完整的错误处理和资源释放工作(如在 Activity 或 Fragment 销毁时释放 ExoPlayer),实际应用中请确保这些部分得到了妥善处理