前言

MediaPlayer很熟悉了,但也是熟悉部分的接口,加上记忆力不给力,总是忘记。

这里简单记录一下MediaPlayer播放不同来源的音频文件的方法。

正文

播放raw资源

方式1
AssetFileDescriptor assetFileDescriptor = getResources().openRawResourceFd(R.raw.kh);
if(null!=assetFileDescriptor){
    try {
        mediaPlayer.setDataSource(assetFileDescriptor);
        //或
        //mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
    } catch (IOException e) {
        e.printStackTrace();
    }
}
方式2
try {
    mMediaPlayer.setDataSource(BiuApp.getContext(), Uri.parse("android.resource://" + BiuApp.getContext().getPackageName() + "/" + R.raw.music));
    mMediaPlayer.prepareAsync();
} catch (IOException e) {
    e.printStackTrace();
}
方式3
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.music);

这种写法需要注意一下create()中源码,要不然很容易出问题

//frameworks\base\media\java\android\media\MediaPlayer.java
public static MediaPlayer create(Context context, int resid,
        AudioAttributes audioAttributes, int audioSessionId) {
    try {
        AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
        if (afd == null) return null;
        MediaPlayer mp = new MediaPlayer(audioSessionId);
        final AudioAttributes aa = audioAttributes != null ? audioAttributes :
            new AudioAttributes.Builder().build();
        mp.setAudioAttributes(aa);
        mp.native_setAudioSessionId(audioSessionId);
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        afd.close();
        mp.prepare();
        return mp;
    } catch (IOException ex) {
        Log.d(TAG, "create failed:", ex);
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "create failed:", ex);
    } catch (SecurityException ex) {
        Log.d(TAG, "create failed:", ex);
    }
    return null;
}

上面create()方法中有MediaPlayer.prepare(),因此创建之后,不要再prepare()!!!!

要不然异常闪退。

Caused by: java.lang.IllegalStateException at android.media.MediaPlayer._prepare(Native Method)

因为我后面又MediaPlayer.prepare()一次,太尴尬了。

还是得多看源码~_~

播放assets资源

AssetManager assetManager = getAssets();
MediaPlayer mediaPlayer = new MediaPlayer();
try {
    AssetFileDescriptor assetFileDescriptor =  assetManager.openFd("music.mp3");
    mediaPlayer.setDataSource(assetFileDescriptor);
} catch (IOException e) {
    e.printStackTrace();
}

播放Uri资源

try {
    //需要网络权限等
    Uri uri = Uri.parse("http://downsc.chinaz.net/Files/DownLoad/sound1/201906/11582.mp3");
    //是raw资源
    //uri = Uri.parse("android.resource://" + BiuApp.getContext().getPackageName() + "/" + R.raw.kh);
    mMediaPlayer.setDataSource(BiuApp.getContext(), uri);
    mMediaPlayer.prepareAsync();
} catch (IOException e) {
    e.printStackTrace();
}

播放本地资源

MediaPlayer mediaPlayer = new MediaPlayer();
//1. 内置sdcard /sdcard/music.mp3
//2. 外部U盘    /storage/udisk0/music.mp3
mediaPlayer.setDataSource("/sdcard/music.mp3");

参考文章

相关文章

暂无评论

none
暂无评论...