36.android:
layout_width="match_parent"
37.android:
layout_height="wrap_content"
38.android:
id="+id/sb"
39./>
40.
1.5.3代码实现
【文件1-8】MainActivity.java
1.package.example.musicplayer;
2.
3.importjava.util.Timer;
4.importjava.util.TimerTask;
5.importandroid.media.AudioManager;
6.importandroid.media.MediaPlayer;
25
7.importandroid.os.Bundle;
8.importandroid.view.View;
9.importandroid.widget.SeekBar;
10.importandroid.widget.SeekBar.OnSeekBarChangeListener;
11.importandroid.widget.Toast;
12.importandroid.app.Activity;
13./**
14.*实现音乐播放器
15.*
16.*authorwzy2016-1-28
17.*
18.*/
19.publicclassMainActivityextendsActivityimplementsOnSeekBarChangeListener{
20.
21.privateSeekBarsb;
22.privateMediaPlayerplayer;
23.privateintduration;
24.//播放器的几个状态
25.privatestaticfinalintPLAYING=1;//播放状态
26.privatestaticfinalintPAUSING=2;//暂停状态
27.privatestaticfinalintSTOPPING=3;//停顿状态
28.privatevolatileintCURRENT=0;//当前状态
29.privateTimertimer;
30.
31.Override
32.protectedvoidonCreate(BundlesavedInstanceState){
33.super.onCreate(savedInstanceState);
34.setContentView(R.layout.activity_main);
35.sb=(SeekBar)findViewById(R.id.sb);
36.//设置拖动监听
37.sb.setOnSeekBarChangeListener(this);
38.}
39./**
40.*播放
41.*/
42.publicvoidplay(Viewview){
43.if(player!
=null){
44.if(CURRENT==PLAYING){
45.Toast.makeText(this,"音乐已经在播放了",Toast.LENGTH_SHORT).show();
46.return;
47.}elseif(CURRENT==PAUSING){
48.player.start();
49.CURRENT=PLAYING;
50.return;
26
51.}
52.}
53.try{
54.//创立一个播放器对象
55.player=newMediaPlayer();
56.//给播放器设置音乐路径
57.player.setDataSource("/mnt/sdcard/test.mp3");
58.//设置音乐格式
59.player.setAudioStreamType(AudioManager.STREAM_MUSIC);
60.//准备
61.player.prepare();
62.//获取音乐最大长度〔毫秒单位〕
63.duration=player.getDuration();
64.//给SeekBar设置最大值
65.sb.setMax(duration);
66.//音乐开场播放
67.player.start();
68.//设置当前的状态为播放
69.CURRENT=PLAYING;
70.if(timer==null){
71.//创立定时器
72.timer=newTimer();
73.}
74./**
75.*参数1:
匿名内部类,相当于Runnable类
76.*参数2:
第一次延时多长时间〔毫秒〕后执行,0那么代表立即执行
77.*参数3:
每隔多长时间(毫秒)执行一次
78.*/
79.timer.schedule(newTimerTask(){
80.
81.Override
82.publicvoidrun(){//该方法每1秒被调用一次
83.
if
(CURRENT==PLAYING)
{
84.
runOnUiThread(new
Runnable()
{
85.
86.
Override
87.
public
void
run()
{
88.
//
双重判断,尽可能防止线程问题,因为该段代码时在主线程中的,
89.
//
第一次判断是在子线程中进展的
90.
if
(player!
=null&&CURRENT==PLAYING)
{
91.
//
获取当前的播放进度
92.
int
currentPosition
=
player.getCurrentPosition();
93.
//
设置给
SeekBar
94.
sb.setProgress(currentPosition);
95.
}
27
96.
}
97.});
98.}
99.
100.}
101.
},
0,
1000);
102.
103.}catch(Exceptione){
104.e.printStackTrace();
105.Toast.makeText(this,"音乐播放失败"+e,0).show();
106.}
107.}
108./**
109.*暂停
110.*/
111.publicvoidpause(Viewview){
112.if(player!
=null&&CURRENT==PLAYING){
113.player.pause();
114.CURRENT=PAUSING;
115.}
116.}
117./**
118.*停顿
119.*/
120.publicvoidstop(Viewview){
121.if(pla