本代码为教学材料,仅作学习使用,分析在注释里。
采用读取 SD 或者其他路径下的方式播放音乐文件。
AndoirdManifest.xml 配置文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.examplemp3">
// 获取读写内部存储器的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<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/AppTheme">
<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>
MP3Player.java
package com.example.player;
import android.content.Context;
import android.media.MediaPlayer;
import android.os.Environment;
import android.widget.Toast;
import com.example.examplemp3.MainActivity;
import java.io.IOException;
public class MP3Player {
private MediaPlayer mp;
private String path;
private int length;
public MP3Player(Context ctx) {
mp = new MediaPlayer();
// 获取内部存储器绝对路径
path = Environment.getExternalStorageDirectory().getAbsolutePath();
Toast.makeText(ctx, path, Toast.LENGTH_LONG).show();
}
public int getPosition() {
// 获取当前位置
return mp.getCurrentPosition();
}
public int getLength() {
return length;
}
public void init(String fileName) {
path = path + "/" + fileName;
try {
// 存储在SD卡或其他文件路径下的媒体文件
mp.setDataSource(path);
// 音乐文件准备
mp.prepare();
// 音乐文件长度
length = mp.getDuration();
} catch (IOException e) {
e.printStackTrace();
}
}
public void play() {
mp.start();
}
public void pause() {
mp.pause();
}
public void stop() {
mp.stop();
}
public void destroy() {
mp.release();
}
}
MainActivity.java
package com.example.examplemp3;
import android.annotation.TargetApi;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import com.example.player.MP3Player;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private Button btnPlay;
private Button btnPause;
private Button btnStop;
private SeekBar sk;
private MP3Player mp3Player;
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] permission = {"android.permission.READ_EXTERNAL_STORAGE"};
// 获取动态权限
this.requestPermissions(permission, 0);
mp3Player = new MP3Player(MainActivity.this);
mp3Player.init("exodus.mp3");
btnPlay = (Button)findViewById(R.id.button);
btnPause = (Button)findViewById(R.id.button2);
btnStop = (Button)findViewById(R.id.button3);
sk = (SeekBar)findViewById(R.id.seekBar);
// 设置播放条最大长度
sk.setMax(mp3Player.getLength());
btnPlay.setOnClickListener(playerOnClickListener);
btnPause.setOnClickListener(playerOnClickListener);
btnStop.setOnClickListener(playerOnClickListener);
// 计时器
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
// 设置当前播放条位置
sk.setProgress(mp3Player.getPosition());
}
};
timer.schedule(timerTask, 0 , 10);
}
public View.OnClickListener playerOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
default:
break;
case R.id.button:
mp3Player.play();
break;
case R.id.button2:
mp3Player.pause();
break;
case R.id.button3:
mp3Player.stop();
break;
}
}
};
}