前言
对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");
参考文章
© 版权声明