最近迷上了AndroidAPP,看了点资料就边学边写,只是打发时间的个人爱好,工具为Android Studio3.0.1,为了偷懒,准备给孩子写个听写APP,思路是到时候从APP下载音频资源包到SD卡,APP播放直接读取储存路径下的音频,不用从Android自带的媒体库读取(因为还不会遍历…)。先弄个最简单的指定路径播放和APP资源里MP3播放。
APP资源里MP3播放
XML 略,
java代码:
//通过create()方法设置数据源,则不能写mediaPlayer.prepare()方法
final MediaPlayer mp =MediaPlayer.create(this, R.raw.yes);
//为按钮play添加监听事件
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mp.start();
Log.v("0001","Main01");
}
});
播放指定路径的MP3
使用的Genymotion模拟器,这是拷贝的MP3文件
代码中用setDataSource指定路径时就要用这个路径,
mp.setDataSource("/storage/emulated/0/mp3/002.mp3")
在Android Device Monitor中看这个路径为:/mnt/shell/emulated/0/mp3/001.mp3 用这个路径是不能找到音频的,但是我用真机时,用Android Device Monitor中的实际地址能找到音频文件,不懂。
XML就是3个功能键,下面直接上java代码:
public class bao_cun extends AppCompatActivity {
/**
* Isstart 为播放状态变量,0为停止,1为播放,2为暂停
* currentPlayPosition 为记录暂停时的播放时间变量,继续播放时从这个变量时间开始播放。
*/
//实例化MediaPlayer,并设定静态变量 mp
private MediaPlayer mp = new MediaPlayer();
public static MediaPlayer playe = null;
//播放状态
private int Isstart = 0;
//音乐暂停后读取标记变量
private int currentPlayPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册XML
setContentView(R.layout.activity_bao_cun);
TextView fanHui = (TextView) findViewById(R.id.fanHui_01);
Button sd_boFang = (Button) findViewById(R.id.sD_bofang);
Button sd_tingZhi = (Button) findViewById(R.id.sD_tingZhi);
Button sd_zanTing = (Button) findViewById(R.id.sD_zanTing);
//返回前一页
fanHui.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(bao_cun.this, MainActivity.class);
startActivity(intent);
}
});
//暂停
sd_zanTing.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Isstart == 1){
//isPlaying()返回 boolean,是否正在播放
if(mp != null && mp.isPlaying()){
//记录暂停时的时间
currentPlayPosition = mp.getCurrentPosition();
mp.pause();
Isstart = 2;
}}else {
//读取并跳至记录的暂停时的时间
mp.seekTo(currentPlayPosition);
mp.start();
Isstart = 1;
}
}
});
//停止
sd_tingZhi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mp != null){
mp.stop();
mp.reset();
Isstart = 0;
}
}
});
//播放按钮监听
sd_boFang.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 跳转
kaibo1();
//输出日志
Log.v("0001","yunxing");
}
});
}
private void kaibo1() {
//如果是停止状态就重新开始播放
if(Isstart == 0) {
//防错误处理
try {
//mp3实际地址(三星手机)
// mp.setDataSource("/storage/extSdCard/001.mp3");
//模拟器地址
mp.setDataSource("/storage/emulated/0/mp3/002.mp3");
//输出调试信息
System.out.println("OK001");
//prepare方法是将资源同步缓存到内存中,一般加载本地较小的资源可以用这个
//通过create()方法设置数据源,则不能写mediaPlayer.prepare()方法
mp.prepare();
System.out.println("OK002");
//开始播放
mp.start();
Isstart = 1;
//错误类型
} catch (IOException e) {
//出现错误处理
e.printStackTrace();
System.out.println("OK003");
}
//如果是暂停就继续播放
}else if(Isstart == 2){
//读取并跳至记录的暂停时的时间
mp.seekTo(currentPlayPosition);
mp.start();
Isstart = 1;
}else {//在播放时就无动作
}
}
}
这里主要是借鉴了别人的代码,直通车:https://blog.csdn.net/u012156341/article/details/78979835
我其实就是把代码撸了遍,大概搞清了各自的作用。个人认为学东西在怎么看都没自己实际做一下来的快。
这里说明一下,近期学校老师要求听写就给孩子说汉语,让孩子写英文,所以这个APP就没必要写下去了。这会又把放了一段时间的8266弄出来折腾了。