当前位置:首页 > 行业动态 > 正文

安卓加载网络音频

使用MediaPlayer实例,通过setDataSource设置网络音频URL,调用prepareAsync准备后,在OnPreparedListener中启动play()播放

权限申请与配置

基础权限配置

AndroidManifest.xml 中声明网络访问权限:

安卓加载网络音频  第1张

<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 的 PlaybackStateBufferUpdateListener

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)
    }
});
0