Android多媒体分析(五)音乐播放器实例
源码下载地址csdn零分下载地址:http://download.csdn.net/detail/zqiang_55/3921190
总之说了这么多上个例子让大家看看吧!先来个简单的例子,上图:
先说说这个程序的基本框架吧:这个程序有两个线程一个Main负责播放音乐,一个Handler负责更新数据,这个播放器是通过ContentProvider获取存在
数据库中的相关信息,然后播放音乐。附上代码:
这里注释挺详细的如果有什么不明白的可以看前几篇文章,里面有详细解释:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 初始化各种控件
ProceseekBar2 = (SeekBar) findViewById(R.id.seekBar1); // ProceseekBar2是调节播放进度的拖动条
SoundseekBar = (SeekBar) findViewById(R.id.seekBar2); // SoundseekBar是调节音量的拖动条
button = (Button) findViewById(R.id.button1);
nowPlayTime = (TextView) findViewById(R.id.textView1);
allTime = (TextView) findViewById(R.id.textView2);
volumeView = (TextView) findViewById(R.id.textView3);
maxVolumeTextView = (TextView) findViewById(R.id.textView4);
songNameTV = (TextView) findViewById(R.id.songName);
songTitleTV = (TextView) findViewById(R.id.songTitle);
button.setOnClickListener(new ButtonListener());
// 获取歌曲的相关信息
getSongInfo();
// 显示歌曲名称和歌手
songTitleTV.setText("歌曲名称:" + songTitle);
songNameTV.setText("歌手:" + songName);
mediaPlayer = new MediaPlayer();
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
// 获取最大音量getStreamMaxVolume
int MaxSound = audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
maxVolumeTextView.setText(String.valueOf(MaxSound));
// 设置音量的最大范围
SoundseekBar.setMax(MaxSound);
// 获取当前音量范围getStreamVolume
int currentSount = audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
volumeView.setText(String.valueOf(currentSount));
SoundseekBar.setProgress(currentSount);
SoundseekBar.setOnSeekBarChangeListener(new SeekBarListener());
ProceseekBar2.setOnSeekBarChangeListener(new ProcessBarListener());
}
// 从数据库读取歌曲信息,此处只做了读取数据库中第一首歌曲的信息
private void getSongInfo() {
// TODO Auto-generated method stub
ContentResolver cr = getContentResolver();
/** 此处的query是ContentResolver,不是数据库的,因此必须得到一个ContentResolver对象
* 返回所有在外部存储卡上的音乐文件的信息
* 第二个参数Null则返回所有信息
*/
Cursor c = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
if(c == null) {
Toast.makeText(this, "没有歌曲信息", Toast.LENGTH_SHORT).show();
} else {
if(c.moveToFirst()) {
// 获取歌曲的ID
// int id = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
// int testid = c.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);
// // 从此处可以看出歌曲信息的在队列中是从0开始的
// Toast.makeText(this, "有歌曲信息" + testid, Toast.LENGTH_SHORT).show();
// 获取歌曲名称
songTitle = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
// 获取歌手名
songName = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
// 获取播放路径,由于获取的路径为/mnt/sdcard所以要去掉/mnt
songPath = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)).substring(4);
// 获取歌曲时间长度
// int_TotalTime = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
}
}
}
class ButtonListener implements OnClickListener {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
button.setText("播放");
} else {
try {
// 获取歌曲的全部时间并显示
int Alltime = mediaPlayer.getDuration();
allTime.setText(ShowTime(Alltime));
mediaPlayer.reset();
mediaPlayer.setDataSource(songPath);
mediaPlayer.prepare();
mediaPlayer.start();
button.setText("暂停");
// 更新各种参数
StrartbarUpdate();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class ProcessBarListener implements OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
if (fromUser == true) {
// process为此时bar的值,即歌曲播放时间此时的进度
// seekTo()将播放进度跳到bar的值
mediaPlayer.seekTo(progress);
// 同时更新显示时间
nowPlayTime.setText(ShowTime(progress));
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
}
// 调节音量大小
class SeekBarListener implements OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
if (fromUser) {
int SeekPosition = seekBar.getProgress();
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
SeekPosition, 0);
}
volumeView.setText(String.valueOf(progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
}
// 将ms转换为分秒时间显示函数
public String ShowTime(int time) {
// 将ms转换为s
time /= 1000;
// 求分
int minute = time / 60;
// 求秒
int second = time % 60;
minute %= 60;
return String.format("%02d:%02d", minute, second);
}
Handler handler = new Handler();
public void StrartbarUpdate() {
// 更新seekBar1
handler.post(r);
}
Runnable r = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// 获取歌曲的播放进度是通过MediaPlayer这个类取得的
// 获取歌曲播放到多少ms
int CurrentPosition = mediaPlayer.getCurrentPosition();
// 更新播放时间显示
nowPlayTime.setText(ShowTime(CurrentPosition));
// 获取歌曲总时间长度
int mMax = mediaPlayer.getDuration();
// 设置bar的最大范围
ProceseekBar2.setMax(mMax);
ProceseekBar2.setProgress(CurrentPosition);
// 每隔100ms更新一次
handler.postDelayed(r, 100);
}
};
// 退出时做出相应的处理
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
handler.removeCallbacks(r);
mediaPlayer.stop();
mediaPlayer.release();
super.onDestroy();
}
在文章的最后,我会附上一个csdn零积分的下载地址。这里面有详细的注释。并且里面还有一个比较复杂的播放器。先上播放器的图:
csdn零分下载地址:http://download.csdn.net/detail/zqiang_55/3921190