您的位置:首页 > 移动开发 > Android开发

Android多媒体分析(五)音乐播放器实例

2012-11-15 01:07 495 查看
源码下载地址csdn零分下载地址:http://download.csdn.net/detail/zqiang_55/3921190

总之说了这么多上个例子让大家看看吧!先来个简单的例子,上图:



先说说这个程序的基本框架吧:这个程序有两个线程一个Main负责播放音乐,一个Handler负责更新数据,这个播放器是通过ContentProvider获取存在

数据库中的相关信息,然后播放音乐。附上代码:

这里注释挺详细的如果有什么不明白的可以看前几篇文章,里面有详细解释:

<SPAN style="FONT-SIZE: 16px">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();

}

</SPAN>

在文章的最后,我会附上一个csdn零积分的下载地址。这里面有详细的注释。并且里面还有一个比较复杂的播放器。先上播放器的图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: