MediaPlayer播放音频
原创
©著作权归作者所有:来自51CTO博客作者qq5d510d208e604的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
MediaPlayer提供的常用方法
方法
| 说明
|
MediaPlayer
| 构造方法
|
create
| 创建一个要播放的多媒体
|
getCurrentPosition
| 得到当前播放位置
|
getDuration
| 得到文件的时间
|
getVideoHeight
| 得到视频的高度
|
getVideoWidth
| 得到视频的宽度
|
isLooping
| 是否循环播放
|
isPlaying
| 是否正在播放
|
pause
| 暂停
|
prepare
| 准备(同步)
|
prepareAsync
| 准备(异步)
|
release
| 释放MediaPlayer对象相关的资源
|
reset
| 重置MediaPlayer对象为刚刚创建的状态
|
seekTo
| 指定播放的位置(以毫秒为单位的时间)
|
setAudioStreamType
| 设置流媒体的类型
|
setDataSource
| 设置多媒体数据来源(位置)
|
setDisplay
| 设置用SurfaceHolder来显示多媒体
|
setLooping
| 设置是否循环播放
|
setOnButteringUpdateListener
| 网络流媒体的缓冲监听
|
setOnErrorListener
| 设置错误信息监听
|
setOnVideoSizeChangedListener
| 视频尺寸监听
|
setScreenOnWhilePlaying
| 设置是否使用SurfaceHolder来保持屏幕显示
|
setVolume
| 设置音量
|
start
| 开始播放
|
stop
| 停止播放
|
如何获得MediaPlayer实例
方法一、create的方式
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
方法二、直接new的方式
MediaPlayer mp = new MediaPlayer();
这两种方式分别对应 栗子1 和 栗子2。
如何设置要播放的文件
1、 用户在应用中事先自带的 resource 资源
mp.create(this, R.raw.test);
2、存储在SD卡或其他文件路径下的媒体文件
mp.setDataSource("/sdcard/test.mp3");
3、网络上的媒体文件
mp.setDataSource("https://music.taihe.com/song/T10057218352");
栗子1
布局代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".MainActivity">
<Button
android:id="@+id/play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Play" />
<Button
android:id="@+id/pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Pause" />
<Button
android:id="@+id/stop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="stop" />
</LinearLayout>
java代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button play;
private Button pause;
private Button stop;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = (Button) findViewById(R.id.play);
pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
play.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
initMediaPlayer();
}
private void initMediaPlayer() {
try {
mediaPlayer = MediaPlayer.create(this, R.raw.test);
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
break;
case R.id.pause:
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
break;
case R.id.stop:
if (mediaPlayer.isPlaying()) {
mediaPlayer.reset();
initMediaPlayer();
}
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
}
}
其中R.raw.test
是 res 下的一个mp3文件,需自己创建
栗子2
布局 和 java 代码相同,更改 MediaPlayer 获取实例代码 和 initMediaPlayer()
方法
private MediaPlayer mediaPlayer = new MediaPlayer();
private void initMediaPlayer() {
try {
String path = Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_MUSIC) + File.separator;
final File file = new File(path, "周杰伦 - 三年二班.mp3");
mediaPlayer.setDataSource(file.getAbsolutePath());
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
AndroidManifest.xml 增加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
播放在线音乐
修改initMediaPlayer()
方法。把 setDataSource 改成一个可以播放的网络音乐地址。
private void initMediaPlayer() {
try {
mediaPlayer.setDataSource("http://down010702.tingclass.com/lesson/shi0529/0009/9804/Ellie-Goulding-I'll-Hold-My-Breath.mp3");
mediaPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
}
AndroidManifest.xml 中需要增加 网络权限
<uses-permission android:name="android.permission.INTERNET" />
如果网络歌曲的地址是 http
开头的可能会报错java.io.IOException: Cleartext HTTP traffic to xx.com not permitted
,所以需要在 AndroidManifest.xml 的 application 节点增加
<application
......
android:usesCleartextTraffic="true" >
MediaPlayer: start called in state 0报错处理
点击播放按钮播放不了,且输出如下错误:
解决办法:
1、检查AndroidManifest.xml 是否增加了以下权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2、手机权限管理中是否开启了权限管理
java.io.IOException: Cleartext HTTP traffic to xx.com not permitted 报错处理
如果网络歌曲的地址是 http
开头的可能会报错java.io.IOException: Cleartext HTTP traffic to xx.com not permitted
,所以需要在 AndroidManifest.xml 的 application 节点增加
<application
......
android:usesCleartextTraffic="true" >
Unable to create media player报错处理
在播放网络歌曲时,是需要访问网络的,所以需要在 AndroidManifest.xml 中增加网络权限,如果没有加会报这个错
<uses-permission android:name="android.permission.INTERNET" />
MediaPlayer:Error(1,xxx) 报错处理
如果网络歌曲的地址不正确可能会出现这个问题,所以检查网络歌曲链接。正确的链接应该是在浏览器打开后可以直接播放的:
参考
Android MediaPlayer 播放音频