您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
71_mediaplayer的生命周期&prepare&prepareAsync
发布时间:2021-03-12 21:51:21编辑:雪饮阅读()
今天我们要实现的是异步的媒体播放器,这次简单点就直接用mp3播放为例。
并且只做一个播放按钮和一个输入mp3文件路径的输入框。
那么之前实现的播放mp3实际上是同步的,这样会阻塞主线程的。
所以用异步来实现mp3资源的准备(MediaPlayer.prepareAsync),然后准备结束后会在MediaPlayer. setOnPreparedListener方法接收的回调中给予通知。
那么这样异步的好处就展现出来了,主线程该干嘛干嘛,我们准备好了再通知你可以播放了。
那么具体实现则如:
布局activity_main.xml:
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="/sdcard/cl.mp3"
android:hint="请输入音乐的路径"
android:id="@+id/et_path"
/>
<Button
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放"
android:onClick="onClick"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
然后是主程序MainActivity.java:
package com.example.mp3async;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.File;
public class MainActivity extends AppCompatActivity {
private EditText et_path;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View v) throws Exception {
et_path = this.findViewById(R.id.et_path);
String path = et_path.getText().toString().trim();
if ("".equals(path)) {
Toast.makeText(getApplicationContext(), "路径不能为空", Toast.LENGTH_SHORT).show();
return;
}
File file = new File(path);
if (file.exists()) {
// 如果文件存在才进行播放操作
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(path);
//采用异步的方式进行准备媒体资源
mediaPlayer.prepareAsync();
//监听媒体资源准备
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
//当媒体资源准备完成后会触发该回调
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
} else {
Toast.makeText(getApplicationContext(), "文件不存在", Toast.LENGTH_SHORT).show();
return;
}
}
}
和以前一样,外存读取权限还是需要的AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mp3async">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Mp3Async">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
部署到设备上,当然了音频效果就不能展示了。。。
关键字词:mediaplayer,android,prepareAsync