Android多媒体分析(五)音乐播放器实例
来源:互联网 发布:域名的dns怎么设置 编辑:程序博客网 时间:2024/04/26 08:32
源码下载地址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零积分的下载地址。这里面有详细的注释。并且里面还有一个比较复杂的播放器。先上播放器的图:
csdn零分下载地址:http://download.csdn.net/detail/zqiang_55/3921190
0 0
- Android多媒体分析(五)音乐播放器实例
- Android多媒体分析(五)音乐播放器实例
- Android多媒体分析(五)音乐播放器实例
- Android多媒体分析(五)音乐播放器实例
- Android多媒体分析(五)音乐播放器实例
- Android多媒体分析(五)音乐播放器实例
- Android多媒体分析(五)音乐播放器实例
- Android多媒体--音乐播放器实例
- Android多媒体(音乐播放器)实例
- android 多媒体编程(五) 调用系统播放器播放音乐/视频
- android多媒体音乐(MediaPlayer)播放器
- Android---多媒体(音乐播放器)
- Android 多媒体(音乐播放器)
- Android多媒体(音乐播放器)
- Android 音乐播放(多媒体)
- Android 多媒体中的音乐播放器编程
- android 多媒体——音乐播放器
- Android多媒体之音乐播放器
- Android多媒体分析(四)AudioManager
- APACHE +TOMCAT配置负载均衡全程
- 设置Ubuntu环境变量 PATH 的方法 及配置备份
- ALSA驱动分析,比ALSA官方文档好理解多了
- ios中将字符串转换为时间显示
- Android多媒体分析(五)音乐播放器实例
- 非棒子处理器 linux内核移植笔记
- 织物缺陷图像识别算法
- 字符串逆转
- Asp.NET获取文件及其路径
- android 获取ip地址和mac地址的多种方式
- Android多媒体分析(六)对AudioManager的一点补充
- SVD Recommendation System in Ruby
- java接口回调的解析