【Android实现 资源路径/手机内存/网络文件 下的音频播放】

业务背景:谈业务背景之前,想说的是,出身java开发的我竟然转生到Android异世界当勇者,因为害怕加班,而点满了各种网上get的技能点~
可以说是在一阵疯狂查阅后,终于是解决了第一个问题,assets下的音频播放,接着由浅入深,向后是实现播放手机内存上的音频…

一、直接上封装方法

	/**
     *  在线播放音乐
     */
    void playOnlineSound(String soundUrlDict) {
    
    
        try {
    
    
            Log.i(TAG,"playOnlineSound:"+soundUrlDict);
            MediaPlayer mediaPlayer = new MediaPlayer();
            if(!TextUtils.isEmpty(soundUrlDict) && !soundUrlDict.contains("/")){
    
    //如果不包含"/" 则调用assets内的音频   例xxx.mp3
                //获取assets目录下音频文件的AssetFileDescriptor
                AssetFileDescriptor afd = getAssets().openFd(soundUrlDict);
                //获取AssetFileDescriptor中的 音频文件 / 起始偏移量 / 文件长度:
                mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            }else if(!TextUtils.isEmpty(soundUrlDict) && !soundUrlDict.contains("http")) {
    
    //如果包含"/" 则调用手机文件系统内的音频 例:/storage/emulated/0/KuwoMusic/music/雪.mp3
                    File file = new File(soundUrlDict);
                    FileInputStream fis = new FileInputStream(file);
                    mediaPlayer.setDataSource(fis.getFD());
            }else {
    
    //调用网络音频 例:http://****/xxx.mp3
                mediaPlayer.setDataSource(soundUrlDict);
            }
            //异步准备播放
            mediaPlayer.prepareAsync();
            //开始播放
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    
    
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
    
    
                    mediaPlayer.start();
                }
            });
            //释放MediaPlayer对象
            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    
    
                @Override
                public void onCompletion(MediaPlayer mp) {
    
    
                    if (mp != null) {
    
    
                        mp.release();
                    }
                    Log.d(TAG, "onCompletion: play sound.");
                }
            });
            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
    
    
                @Override
                public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
    
    
                    Log.d(TAG, "Play online sound onError: " + i + ", " + i1);
                    return false;
                }
            });
        } catch (IOException e1) {
    
    
            Log.e(TAG, "url: ", e1);
        }
    }

二、解释

这段代码实现了在线播放音乐的功能。它接收一个参数 soundUrlDict,代表音乐的地址。

  • 如果地址中不包含斜杠(/),则说明该地址指向应用程序的 assets 目录中的音频文件,程序会从该目录获取音频文件的AssetFileDescriptor,然后设置 MediaPlayer 的数据源为该文件。
  • 如果地址中包含斜杠但不包含 “http”,则说明该地址指向手机文件系统内的音频文件,程序会从该文件获取FileInputStream,然后设置 MediaPlayer的数据源为该文件。
  • 如果地址中包含 “http”,则说明该地址指向网络上的音频文件,程序会直接设置MediaPlayer的数据源为该地址。然后程序异步准备播放,并在准备完成后开始播放。当播放完成后,程序会释放 MediaPlayer对象。
  • 如果在播放过程中出现错误,则程序会打印错误信息。 根据具体场景具体使用。

猜你喜欢

转载自blog.csdn.net/qq_48424581/article/details/131312802
今日推荐