Android里面的多媒体主要是两部分,第一部分是音频和视频,第二部分是动画(帧动画,补间动画,属性动画)
先导入我们需要用到的音频文件和视频文件
第一步,创建raw文件夹
导入文件
第一步,创建assets文件夹
第二步导入文件
第一步,添加播放音乐按钮
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="106dp"
android:text="播放音乐"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
public class MainActivity extends AppCompatActivity {
MediaPlayer mMediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//播放音乐
mMediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.a1);
mMediaPlayer.start();
}
});
}
}
运行(这里动态图没有声音,但可以仔细观察,右下角录屏软件悬浮球,一开始是静止的,在点击播放音乐后,有音频波浪变化)
第一步,添加停止播放的按钮
复制代码到之前的布局代码的下面
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="116dp"
android:layout_marginEnd="40dp"
android:layout_marginRight="40dp"
android:text="暂停音乐"
app:layout_constraintBottom_toBottomOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
Button button1=findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//暂停音乐
mMediaPlayer.pause();
}
});
运行(仔细看悬浮球,在点击暂停后音频波浪不再变化)
但是这里暂停以后再点击播放音乐,会重新加载音乐,也就是从头播放音乐,这个问题下面来解决
实际上很简单,只需要加一个if判断语句,只在mMediaPlayer==null重新加载文件,不等于空时直接播放,不需要重新加载
Button button=findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMediaPlayer == null) {
mMediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.a1);
}
//播放音乐
mMediaPlayer.start();
}
});
运行(这里好像不能证明是继续播放,哈哈,相信我,一定可以的)
还有一个问题(如果我们运行程序后直接点击暂停文件,会出现闪退)
原因在于,因为一开始我们没有点击播放音乐的话,实际上就没有加载MediaPlayer加载文件,所以直接点击暂停音乐会报空指针错误
解决方法,用if判断,只在MediaPlayer不为空的时候调用pause方法
Button button1=findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//因为一开始没有播放音乐的时候,实际上就没有加载音频文件,所以点击暂停会报空指针
if (mMediaPlayer !=null) {
//暂停音乐
mMediaPlayer.pause();
}
}
});
在实现一个进度条的时候,需要获取歌曲当前播放时间和歌曲的总时长
//获取音乐当前播放的时间
Log.i("Mainactivity","当前播放时间:"+mMediaPlayer.getCurrentPosition()+"ms");
//获取音乐总时长
Log.i("Mainactivity","总时长:"+mMediaPlayer.getDuration()+"ms");
在实现一个拖动进度条来改变音乐播放的位置时,我们需要音乐跳到指定位置,需要用到seekto 这个方法
Button button1=findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//快进到50秒的位置
mMediaPlayer.seekTo(50*1000);
//获取音乐当前播放的时间
Log.i("Mainactivity","当前播放时间:"+mMediaPlayer.getCurrentPosition()+"ms");
//获取音乐总时长
Log.i("Mainactivity","总时长:"+mMediaPlayer.getDuration()+"ms");
}
});
运行(点击暂停按钮(实际上是快进),可以看打印日志,音乐快进到了50秒的位置)
Button button1=findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onClick(View v) {
PlaybackParams playbackParams=mMediaPlayer.getPlaybackParams();
playbackParams.setSpeed(3.0f);// 3 倍速播放
mMediaPlayer.setPlaybackParams(playbackParams);
//获取音乐当前播放的时间
Log.i("Mainactivity","当前播放时间:"+mMediaPlayer.getCurrentPosition()+"ms");
//获取音乐总时长
Log.i("Mainactivity","总时长:"+mMediaPlayer.getDuration()+"ms");
}
});
这里报了个错,表示只有在手机版本在23或者以上才能运行
我们只需要按住alt+enter,添加注释就可以了
运行(可以发现两次播放时间跨度比正常时间大)
Button button=findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMediaPlayer == null) {
mMediaPlayer=new MediaPlayer();
try {
mMediaPlayer.setDataSource("data/data/com.c201801020224.myapplication/a1.mp3");
mMediaPlayer.prepare();//先缓冲一下
} catch (IOException e) {
e.printStackTrace();
}
}
//播放音乐
mMediaPlayer.start();
}
});
运行
第一步,添加权限
<uses-permission android:name="android.permission.INTERNET"/>
application结点下添加
android:usesCleartextTraffic="true"
Button button=findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMediaPlayer == null) {
mMediaPlayer=new MediaPlayer();
try {
mMediaPlayer.setDataSource("http://148.70.46.9/123.mp3");//网络歌曲地址
mMediaPlayer.prepareAsync();//异步缓冲
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//监听是否缓冲完毕,缓冲完成再播放音乐
@Override
public void onPrepared(MediaPlayer mp) {
//播放音乐
mMediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
第三步,卸载应用(因为添加了权限,所以需要重新生成应用)
第四步,运行(可能开始缓冲会比本地速度慢一点)
关于音频播放就先讲到这里啦,下一讲我们讲视频播放,谢谢您的阅读。
附一张麦迪帅照
Android 入门第九讲02-视频(本地视频播放,暂停,获取播放时间,重新播放,播放到指定位置,MediaController类(实现进度条,快进,播放暂停),播放网络视频)