Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

13.2. MediaPlayer

13.2.1. 播放Raw下的元数据

播放一段特效声音,例如铃音,可以在点击按钮德时候调用 playSound()

			
	private void playSound(){

        MediaPlayer mediaPlayer = MediaPlayer.create(FlashLightActivity.this, R.raw.alert);
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                mediaPlayer.release();
            }
        });
        mediaPlayer.start();
    }
			
			

播放 res 中的资源文件

			
	AssetFileDescriptor assetFileDescriptor = context.getResources().openRawResourceFd(R.raw.music);		

    public void play(AssetFileDescriptor assetFileDescriptor) {
        if (mediaPlayer != null) {
            try {
                this.reset();
                mediaPlayer.setDataSource(assetFileDescriptor);
                // 或使用这种方式 mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
                mediaPlayer.prepare();
                //注意不能使用异步,异步方式是用来播放网络流音乐
				// mediaPlayer.prepareAsync(); 
                assetFileDescriptor.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            mediaPlayer.start();
        }
    }
			
			

播放 assets 文件夹中的资源

			
//实例化播放器
MediaPlayer mediaPlayer = new MediaPlayer();
AssetManager am = getAssets();
try {
    AssetFileDescriptor afd = am.openFd("assets_video.mp4");
    mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IOException e) {
    e.printStackTrace();
}
//设置准备就绪状态监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
         // 开始播放
         mediaPlayer.start();
     }
});
//准备播放
mediaPlayer.prepareAsync();		
			
			

其他方式获得 assets 文件夹中的资源

			
		String url = "file:///android_asset/" + "video.mp3";	
        AssetFileDescriptor assetFileDescriptor = null;
        try {
            assetFileDescriptor = context.getResources().getAssets().openFd("nepal.mp3");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }			
			
			

13.2.2. 播放assets文件夹中的音乐

			
 //需将资源文件放在assets文件夹
 AssetFileDescriptor fd = getAssets().openFd("samsara.mp3");
 mMediaPlayer.setDataSource(fd)
 mMediaPlayer.prepare() 
 
 AssetFileDescriptor fd = getAssets().openFd("samsara.mp3");
 mMediaPlayer.setDataSource(fd, fd.getStartOffset(), fd.getLegth())
 mMediaPlayer.prepare();			
			
			

13.2.3. 播放互联网音乐

			
package cn.netkiller.demo.skill;

import android.media.MediaPlayer;
import android.util.Log;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.io.IOException;

public class Bible {
    private static final String TAG = Bible.class.getSimpleName();

    public Bible(JSONArray array) {
        Log.i(TAG, array.toString());
        JSONObject item = (JSONObject) array.get(1);
        String url = item.getString("url");
        Log.i(TAG, "Audio url: " + url);
        MediaPlayer mediaPlayer = new MediaPlayer();
        try {
            mediaPlayer.setDataSource(url);//设置播放来源
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        mediaPlayer.prepareAsync();//异步准备
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            //异步准备监听
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {

                Log.i(TAG, "Voice异步文件时长: " + mediaPlayer.getDuration() / 1000 + "");
                mediaPlayer.start();//播放
            }
        });
        mediaPlayer.setScreenOnWhilePlaying(true);// 设置播放的时候一直让屏幕变亮
        mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            //文件缓冲监听
            @Override
            public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {

                Log.i(TAG, "Voice进度: " + i + "% Voice文件长度" + mediaPlayer.getDuration() / 1000 + "");
            }
        });
    }
}
 		
			
			

13.2.4. 使用单例模式

			
package cn.netkiller.demo.skill;

import android.media.MediaPlayer;
import android.util.Log;

import androidx.annotation.NonNull;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.io.IOException;

public class Bible {
    private static final String TAG = Bible.class.getSimpleName();

    private static MediaPlayer mediaPlayer;

    public synchronized static MediaPlayer getInstance() {
        if (mediaPlayer == null)
            mediaPlayer = new MediaPlayer();
        return mediaPlayer;
    }

    public Bible(@NonNull JSONArray array) {
//        Log.i(TAG, array.toString());
        JSONObject item = (JSONObject) array.get(1);
        String url = item.getString("url");
//        Log.i(TAG, "Audio url: " + item.toString());
        MediaPlayer mediaPlayer = Bible.getInstance();
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(url);//设置播放来源
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        mediaPlayer.prepareAsync();//异步准备
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            //异步准备监听
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                Log.i(TAG, "Voice 播放异步文件,时长: " + mediaPlayer.getDuration() / 1000 + " Audio: " + item.toString());
                mediaPlayer.start();//播放
            }
        });
        mediaPlayer.setScreenOnWhilePlaying(true);// 设置播放的时候一直让屏幕变亮
        mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            //文件缓冲监听
            @Override
            public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {
                Log.i(TAG, "Voice 缓冲区加载进度: " + i + "%");
            }
        });
    }
}
			
			
			

13.2.5. 设置速度,快进播放

			
                PlaybackParams params = new PlaybackParams();
//                params.setSpeed(1.5f);
                params.setSpeed(5f);
                mediaPlayer.setPlaybackParams(params);