进去安卓api文档里查了一下MediaPlayer类
IDle状态理解为空闲状态、就相当于我创建了一个MediaPlayer的对象,这时对象还不用去做什么事
reset()MediaPlayer对象调用该方法后就会进入空闲状态
release()是释放MediaPlayer 调用此方法后进入END状态
具体比较详细的MediaPlayer状态: http://blog.csdn.net/thl789/article/details/7370438
setDataSource("/storage/emulated/0/yy.mp3")设置数据源 这个方法需要传入一个String类型的数据源路径 比如我手机的某一首歌的路径是"/storage/emulated/0/yy.mp3"
Prepare() 准备 如果没有准备好就会停在这个方法不会往下执行 在下面的2G网络去听一首网上的音乐就会体现出这个方法的作用
seekTo(1000)里面传入的参数是一个int类型 指定想要从音频的第几秒开始播放 1000 = 1秒
start();开始播放音频
setLooping(true)设置是否要循环播放 true为循环反之为不循环
setOnCompletionListener()实现该方法后 音频播放完毕会调用该方法中的逻辑 就是我们想这首歌播放之后要 做什么事情
setOnErrorListener()实现该方法后 传入的数据源为这个类不认识的其他格式 就会调用该方法的处理逻辑
pause()暂停播放
Stop()停止播放
还有一个异步准备跟同步准备的问题下面用代码实践一下
同步准备:
写一个按钮用来加载网上的音乐和随便一个选择框
布局文件
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.szh.day10.PlayInternetMp3">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="播放网上的音频"
android:id="@+id/button2"
android:onClick="player"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择题"
android:id="@+id/checkBox"
android:layout_below="@+id/button2"
android:layout_alignRight="@+id/pb"
android:layout_alignEnd="@+id/pb"
android:checked="false" />
</RelativeLayout>
Activity实现
package com.example.szh.day10;
import android.media.MediaPlayer;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import java.io.IOException;
public class PlayInternetMp3 extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_internet_mp3);
}
public void player(View view){
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.reset();
try {
mediaPlayer.setDataSource("http://www.abv.cn/music/光辉岁月.mp3");
mediaPlayer.prepare();//同步的准备
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
第一次我手机是在wifi模式下点击该按钮 只出现了小时间 的卡顿
第二次我使用2G网络点击后 按钮停挂了好久 才播放音乐 加载时界面上的选择框不能点击 整个应用会阻塞 甚至挂掉
一般同步准备用在播放本地音乐 要播放网上音乐需要用到异步准备
其原理就是开启一个子线程去完成这个耗时的操作 不会导致向同步准备一样的主线程阻塞
异步准备:
先在原来的布局文件中加入ProgressBar进度条
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.szh.day10.PlayInternetMp3">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="播放网上的音频"
android:id="@+id/button2"
android:onClick="player"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/pb"
android:visibility="invisible"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择题"
android:id="@+id/checkBox"
android:layout_below="@+id/button2"
android:layout_alignRight="@+id/pb"
android:layout_alignEnd="@+id/pb"
android:checked="false" />
</RelativeLayout>
这里使用默认的进度条 不去计算要下载的文件的大小计算出进度这些比较复杂的操作 这里单单就想实验用异步的好处.。下面是Activity的实现
package com.example.szh.day10;
import android.media.MediaPlayer;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ProgressBar;
import java.io.IOException;
public class PlayInternetMp3 extends ActionBarActivity {
private ProgressBar pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_internet_mp3);
pb = (ProgressBar) findViewById(R.id.pb);
}
public void player(View view){
final MediaPlayer mediaPlayer = new MediaPlayer();
//设置加载圈为可见
pb.setVisibility(View.VISIBLE);
mediaPlayer.reset();
try {
mediaPlayer.setDataSource("http://www.abv.cn/music/光辉岁月.mp3");
mediaPlayer.prepareAsync();//同步的准备
//该监听事件用来监听mediaPlayer对象是否已经准备好
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//准备完毕
mediaPlayer.start();
//设置加载圈为隐藏
pb.setVisibility(View.INVISIBLE);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
总结:
要搞懂整个流程怎么实现的,同步异步的使用场景,异步用在需要网络去访问服务器下载数据源的时候使用,同步使用在数据源为本机的储存,