博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android多媒体分析(五)音乐播放器实例
阅读量:5281 次
发布时间:2019-06-14

本文共 6330 字,大约阅读时间需要 21 分钟。

源码下载地址csdn零分下载地址:

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

先说说这个程序的基本框架吧:这个程序有两个线程一个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零分下载地址:

转载于:https://www.cnblogs.com/wuyida/archive/2011/12/14/6300655.html

你可能感兴趣的文章
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
css & input type & search icon
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
MetaWeblog API Test
查看>>
移动、尺寸改变
查看>>
c# 文件笔记
查看>>
类和结构
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
线程池的概念
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>