上一篇
安卓加载网络音频
- 行业动态
- 2025-04-24
- 3
使用MediaPlayer实例,通过setDataSource设置网络音频URL,调用prepareAsync准备后,在OnPreparedListener中启动play()播放
权限申请与配置
基础权限配置
在 AndroidManifest.xml
中声明网络访问权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Android 13+ 特殊权限
若需在后台播放网络音频,需动态申请 MEDIA_PLAY_LOCATION_PROVIDER
(部分场景):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.MEDIA_PLAY_LOCATION_PROVIDER) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.MEDIA_PLAY_LOCATION_PROVIDER}, REQUEST_CODE); } }
网络音频加载核心逻辑
使用 MediaPlayer(系统原生)
MediaPlayer mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource("https://example.com/audio.mp3"); // 设置网络音源 mediaPlayer.prepareAsync(); // 异步准备 mediaPlayer.setOnPreparedListener(mp -> mp.start()); // 准备完成后自动播放 } catch (IOException e) { e.printStackTrace(); }
使用 ExoPlayer(Google 开源)
// 1. 添加依赖 implementation 'com.google.android.exoplayer:exoplayer:2.20.1' // 2. 初始化播放器 SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); MediaItem mediaItem = MediaItem.fromUri("https://example.com/audio.mp3"); player.setMediaItem(mediaItem); player.prepare(); // 同步准备 player.play(); // 开始播放
关键问题与解决方案
问题 | 解决方案 |
---|---|
网络音频卡顿/缓冲 | 启用 ExoPlayer 缓存功能:LoadControl loadControl = new DefaultLoadControl(); |
音频格式不兼容 | 使用 ExoPlayer 替代 MediaPlayer(支持 Opus、FLAC 等更多格式) |
弱网环境下播放失败 | 增加重试机制:捕获 IOException 后延迟重试(最多 3 次) |
后台播放被系统杀死 | 在 Service 中启动播放,并添加 FOREGROUND_SERVICE 权限 |
完整实现示例(ExoPlayer)
// 1. 布局文件(XML) <com.google.android.exoplayer2.ui.PlayerView android:id="@+id/player_view" android:layout_width="match_parent" android:layout_height="wrap_content"/> // 2. Activity 代码 public class AudioPlayerActivity extends AppCompatActivity { private PlayerView playerView; private SimpleExoPlayer player; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_audio_player); playerView = findViewById(R.id.player_view); // 初始化播放器 player = new SimpleExoPlayer.Builder(this).build(); playerView.setPlayer(player); // 设置音源并播放 MediaItem mediaItem = MediaItem.fromUri("https://example.com/audio.mp3"); player.setMediaItem(mediaItem); player.prepare(); player.play(); } @Override protected void onDestroy() { super.onDestroy(); player.release(); // 释放资源 } }
相关问题与解答
问题 1:如何实现网络音频的断点续播?
解答:
通过记录已播放的时间位置(currentPosition
),在重新加载时跳转到该位置。
// 保存进度 SharedPreferences prefs = getSharedPreferences("audio_prefs", MODE_PRIVATE); prefs.edit().putLong("last_position", player.getCurrentPosition()).apply(); // 恢复进度 long lastPosition = prefs.getLong("last_position", 0); player.seekTo(lastPosition);
问题 2:如何监听网络音频的缓冲进度?
解答:
使用 ExoPlayer 的 PlaybackState
和 BufferUpdateListener
:
player.addListener(new Player.Listener() { @Override public void onPlayerStateChanged(boolean playWhenReady, int state) { // 监听播放状态(如缓冲中、播放中) } }); player.addBufferUpdateListener(new BufferUpdateListener() { @Override public void onBuffering(int percent) { // 实时获取缓冲百分比(0-100) } });