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

来源:互联网 发布:域名的dns怎么设置 编辑:程序博客网 时间:2024/04/26 08:32

源码下载地址csdn零分下载地址:http://download.csdn.net/detail/zqiang_55/3921190

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

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

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

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

[java] view plaincopy
  1. <span style="font-size:16px;">public void onCreate(Bundle savedInstanceState) {  
  2.   super.onCreate(savedInstanceState);  
  3.   setContentView(R.layout.main);  
  4.   
  5.   // 初始化各种控件  
  6.   ProceseekBar2 = (SeekBar) findViewById(R.id.seekBar1);  // ProceseekBar2是调节播放进度的拖动条  
  7.   SoundseekBar = (SeekBar) findViewById(R.id.seekBar2);   // SoundseekBar是调节音量的拖动条  
  8.   button = (Button) findViewById(R.id.button1);  
  9.   nowPlayTime = (TextView) findViewById(R.id.textView1);  
  10.   allTime = (TextView) findViewById(R.id.textView2);  
  11.   volumeView = (TextView) findViewById(R.id.textView3);  
  12.   maxVolumeTextView = (TextView) findViewById(R.id.textView4);  
  13.   songNameTV = (TextView) findViewById(R.id.songName);  
  14.   songTitleTV = (TextView) findViewById(R.id.songTitle);  
  15.     
  16.   button.setOnClickListener(new ButtonListener());  
  17.     
  18.   // 获取歌曲的相关信息  
  19.   getSongInfo();  
  20.   
  21.   // 显示歌曲名称和歌手  
  22.   songTitleTV.setText("歌曲名称:" + songTitle);  
  23.   songNameTV.setText("歌手:" + songName);  
  24.     
  25.   mediaPlayer = new MediaPlayer();  
  26.   audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);  
  27.   // 获取最大音量getStreamMaxVolume  
  28.   int MaxSound = audioManager  
  29.     .getStreamMaxVolume(AudioManager.STREAM_MUSIC);  
  30.   maxVolumeTextView.setText(String.valueOf(MaxSound));  
  31.   // 设置音量的最大范围  
  32.   SoundseekBar.setMax(MaxSound);  
  33.   // 获取当前音量范围getStreamVolume  
  34.   int currentSount = audioManager  
  35.     .getStreamVolume(AudioManager.STREAM_MUSIC);  
  36.   volumeView.setText(String.valueOf(currentSount));  
  37.   SoundseekBar.setProgress(currentSount);  
  38.   SoundseekBar.setOnSeekBarChangeListener(new SeekBarListener());  
  39.   ProceseekBar2.setOnSeekBarChangeListener(new ProcessBarListener());  
  40.   
  41.  }  
  42.   
  43.  // 从数据库读取歌曲信息,此处只做了读取数据库中第一首歌曲的信息  
  44.  private void getSongInfo() {  
  45.   // TODO Auto-generated method stub  
  46.    ContentResolver cr = getContentResolver();  
  47.          /** 此处的query是ContentResolver,不是数据库的,因此必须得到一个ContentResolver对象 
  48.          *   返回所有在外部存储卡上的音乐文件的信息 
  49.          *   第二个参数Null则返回所有信息 
  50.          */  
  51.          Cursor c = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, nullnullnull,  
  52.            MediaStore.Audio.Media.DEFAULT_SORT_ORDER);  
  53.            
  54.          if(c == null) {  
  55.           Toast.makeText(this"没有歌曲信息", Toast.LENGTH_SHORT).show();  
  56.          } else {  
  57.   
  58.           if(c.moveToFirst()) {  
  59.   
  60.                  // 获取歌曲的ID  
  61. //                 int id = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));  
  62. //                 int testid = c.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);  
  63. //                 // 从此处可以看出歌曲信息的在队列中是从0开始的  
  64. //                 Toast.makeText(this, "有歌曲信息" + testid, Toast.LENGTH_SHORT).show();  
  65.                    
  66.                  // 获取歌曲名称  
  67.                  songTitle = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));  
  68.                  // 获取歌手名  
  69.                  songName = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));  
  70.                  // 获取播放路径,由于获取的路径为/mnt/sdcard所以要去掉/mnt  
  71.            songPath = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)).substring(4);  
  72.                  // 获取歌曲时间长度  
  73. //                 int_TotalTime = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));  
  74.           }  
  75.          }  
  76.  }  
  77.   
  78.  class ButtonListener implements OnClickListener {  
  79.   
  80.   @Override  
  81.   public void onClick(View arg0) {  
  82.    // TODO Auto-generated method stub  
  83.    if (mediaPlayer.isPlaying()) {  
  84.     mediaPlayer.pause();  
  85.     button.setText("播放");  
  86.    } else {  
  87.     try {  
  88.      // 获取歌曲的全部时间并显示  
  89.      int Alltime = mediaPlayer.getDuration();  
  90.      allTime.setText(ShowTime(Alltime));  
  91.        
  92.      mediaPlayer.reset();  
  93.      mediaPlayer.setDataSource(songPath);  
  94.      mediaPlayer.prepare();  
  95.      mediaPlayer.start();  
  96.      button.setText("暂停");  
  97.      // 更新各种参数  
  98.      StrartbarUpdate();  
  99.     } catch (IllegalArgumentException e) {  
  100.      // TODO Auto-generated catch block  
  101.      e.printStackTrace();  
  102.     } catch (IllegalStateException e) {  
  103.      // TODO Auto-generated catch block  
  104.      e.printStackTrace();  
  105.     } catch (IOException e) {  
  106.      // TODO Auto-generated catch block  
  107.      e.printStackTrace();  
  108.     }  
  109.    }  
  110.   
  111.   }  
  112.   
  113.  }  
  114.   
  115.  class ProcessBarListener implements OnSeekBarChangeListener {  
  116.   
  117.   @Override  
  118.   public void onProgressChanged(SeekBar seekBar, int progress,  
  119.     boolean fromUser) {  
  120.    // TODO Auto-generated method stub  
  121.    if (fromUser == true) {  
  122.     // process为此时bar的值,即歌曲播放时间此时的进度  
  123.     // seekTo()将播放进度跳到bar的值  
  124.     mediaPlayer.seekTo(progress);  
  125.     // 同时更新显示时间  
  126.     nowPlayTime.setText(ShowTime(progress));  
  127.    }  
  128.   
  129.   }  
  130.   
  131.   @Override  
  132.   public void onStartTrackingTouch(SeekBar seekBar) {  
  133.    // TODO Auto-generated method stub  
  134.   
  135.   }  
  136.   
  137.   @Override  
  138.   public void onStopTrackingTouch(SeekBar seekBar) {  
  139.    // TODO Auto-generated method stub  
  140.   
  141.   }  
  142.   
  143.  }  
  144.   
  145.  // 调节音量大小  
  146.  class SeekBarListener implements OnSeekBarChangeListener {  
  147.   
  148.   @Override  
  149.   public void onProgressChanged(SeekBar seekBar, int progress,  
  150.     boolean fromUser) {  
  151.    // TODO Auto-generated method stub  
  152.    if (fromUser) {  
  153.     int SeekPosition = seekBar.getProgress();  
  154.     audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,  
  155.       SeekPosition, 0);  
  156.    }  
  157.    volumeView.setText(String.valueOf(progress));  
  158.   }  
  159.   
  160.   @Override  
  161.   public void onStartTrackingTouch(SeekBar seekBar) {  
  162.    // TODO Auto-generated method stub  
  163.   
  164.   }  
  165.   
  166.   @Override  
  167.   public void onStopTrackingTouch(SeekBar seekBar) {  
  168.    // TODO Auto-generated method stub  
  169.   
  170.   }  
  171.   
  172.  }  
  173.   
  174.  // 将ms转换为分秒时间显示函数  
  175.  public String ShowTime(int time) {  
  176.   // 将ms转换为s  
  177.   time /= 1000;  
  178.   // 求分  
  179.   int minute = time / 60;  
  180.   // 求秒  
  181.   int second = time % 60;  
  182.   minute %= 60;  
  183.   return String.format("%02d:%02d", minute, second);  
  184.  }  
  185.   
  186.  Handler handler = new Handler();  
  187.   
  188.  public void StrartbarUpdate() {  
  189.   // 更新seekBar1  
  190.   handler.post(r);  
  191.  }  
  192.   
  193.  Runnable r = new Runnable() {  
  194.   
  195.   @Override  
  196.   public void run() {  
  197.    // TODO Auto-generated method stub  
  198.    // 获取歌曲的播放进度是通过MediaPlayer这个类取得的  
  199.    // 获取歌曲播放到多少ms  
  200.    int CurrentPosition = mediaPlayer.getCurrentPosition();  
  201.    // 更新播放时间显示  
  202.    nowPlayTime.setText(ShowTime(CurrentPosition));  
  203.    // 获取歌曲总时间长度  
  204.    int mMax = mediaPlayer.getDuration();  
  205.      
  206.    // 设置bar的最大范围  
  207.    ProceseekBar2.setMax(mMax);  
  208.    ProceseekBar2.setProgress(CurrentPosition);  
  209.    // 每隔100ms更新一次  
  210.    handler.postDelayed(r, 100);  
  211.   }  
  212.  };  
  213.   
  214.  // 退出时做出相应的处理  
  215.  @Override  
  216.  protected void onDestroy() {  
  217.   // TODO Auto-generated method stub  
  218.   handler.removeCallbacks(r);  
  219.   mediaPlayer.stop();  
  220.   mediaPlayer.release();  
  221.   super.onDestroy();  
  222.  }  
  223. </span>  

 

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

 

csdn零分下载地址:http://download.csdn.net/detail/zqiang_55/3921190

0 0
原创粉丝点击