- 論壇徽章:
- 1
|
使用MediaPlayer播放mp3,mp3文件使用線程搜索出來,并顯示在列表上,點擊列表播放
按鈕有4個,可以控制暫停,播放,重新播放,停止。
進(jìn)度條可以監(jiān)控播放進(jìn)度,也可以拖動進(jìn)度條快進(jìn),快退功能。
[Java]代碼- package com.yongzheng.mymusic;
-
- import java.io.File;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Timer;
- import java.util.TimerTask;
-
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.media.MediaPlayer.OnCompletionListener;
- import android.media.MediaPlayer.OnErrorListener;
- import android.media.MediaPlayer.OnPreparedListener;
- import android.os.Bundle;
- import android.os.Environment;
- import android.os.Handler;
- import android.os.Message;
- import android.annotation.SuppressLint;
- import android.app.Activity;
- import android.content.DialogInterface;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.SeekBar;
- import android.widget.SimpleAdapter;
- import android.widget.TextView;
- import android.widget.Toast;
-
- public class MainActivity extends Activity{
-
- private TextView musicName ;//歌曲名稱
- private TextView startTime;//播放時間
- private TextView endTime;//結(jié)束時間
- private SeekBar seekbar;//進(jìn)度條
-
- private Button start;//開始按鈕
- private Button pause;//暫停按鈕
- private Button restart;//重新開始
- private Button stop;//停止按鈕
-
- private ListView mylist;//列表
- private SimpleAdapter adapter = null; // 適配器
-
- private Timer timer;
-
- private MediaPlayer media = null;
- private List<Map<String, String>> musicListData;
-
- private String lastPlayName = null;//記錄最后一次播放的歌曲
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- init();
- }
-
- //初始化
- private void init(){
-
- musicListData =
- new ArrayList<Map<String, String>>(); // 保存所有的List數(shù)據(jù)
-
- this.musicName = (TextView) this.findViewById(R.id.musicName);
- this.startTime = (TextView)this.findViewById(R.id.startTime);
- this.endTime = (TextView)this.findViewById(R.id.endTime);
- this.seekbar = (SeekBar)this.findViewById(R.id.seekbar);
- this.start = (Button)this.findViewById(R.id.start);
- this.pause = (Button)this.findViewById(R.id.pause);
- this.restart = (Button)this.findViewById(R.id.restart);
- this.stop = (Button)this.findViewById(R.id.stop);
- this.mylist = (ListView)this.findViewById(R.id.mylist);
- addList();
- //點擊事件
- this.start.setOnClickListener(new MyClickListener());
- this.pause.setOnClickListener(new MyClickListener());
- this.restart.setOnClickListener(new MyClickListener());
- this.stop.setOnClickListener(new MyClickListener());
-
- this.seekbar.setOnSeekBarChangeListener(new SeekBarOnClickListenerImpl());
- //開啟搜索sd卡中MP3文件的線程
- new Thread(){
- public void run(){
- getMusicDate();//搜索sd卡下面的mp3后綴的文件
- }
- }.start();
- }
-
- //待搜索線程完成后,執(zhí)行這個添加數(shù)據(jù)到界面上
- public void addList(){
- this.adapter = new SimpleAdapter(this,this.musicListData,R.layout.list,
- new String[]{"name","size"},new int[]{R.id.name,R.id.size});
- this.mylist.setAdapter(adapter);
- this.mylist.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> adapt, View v, int postition,
- long id) {
- Map<String,String> map = MainActivity.this.musicListData.get(postition);
- if(MainActivity.this.media!=null){
- stop();
- }
- play(map.get("path"));
- }
- });
- }
-
- //獲取播放列表
- public void getMusicDate(){
-
- if(!(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))){
- //如果不sd卡存在
- return;
- }
- File rootPath = Environment.getExternalStorageDirectory();
- File[] listFile = rootPath.listFiles();
- if(listFile!=null){
- for(File f : listFile){
- if(f.isDirectory()){//如果是目錄
- System.out.println("根文件夾:"+f.getName());
- getFile(f);
- }else{//如果是文件
- getAFile(f);
- }
- }
- }
-
- Message message = new Message();
- message.what = 3;
- MainActivity.this.handler.sendMessage(message);
- return;
- }
-
- //文件
- private void getAFile(File f){
- String fName = f.getName();
- if(!fName.endsWith("mp3")){
- return;
- }
- Map<String,String> map = new HashMap<String,String>();
- map.put("name",fName);
- map.put("size", String.valueOf(f.length()/1024/1024)+"MB");
- map.put("path",f.getAbsolutePath());
- musicListData.add(map);
- System.out.println("音樂文件路徑:"+f.getAbsolutePath());
- }
- //路徑
- private void getFile(File f){
- if(!f.isDirectory()){
- getAFile(f);
- return;
- }
- File[] listFile = f.listFiles();
- if(listFile!=null){
- for(File ff : listFile){
- if(f.isDirectory()){//如果是目錄
- System.out.println("文件夾:"+ff.getName());
- getFile(ff);
- }else{//如果是文件
- System.out.println("文件:"+ff.getName());
- getAFile(ff);
- }
- }
- }
- }
-
- //進(jìn)度條監(jiān)聽回調(diào)
- private class SeekBarOnClickListenerImpl implements SeekBar.OnSeekBarChangeListener {
-
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress,
- boolean fromUser) {
- if(!fromUser)return;
- if(MainActivity.this.media!=null){
-
- Message message = new Message();
- Bundle b = new Bundle();
- b.putInt("p", progress);
- message.setData(b);
- message.what = 2;
- MainActivity.this.handler.sendMessage(message);
- MainActivity.this.media.seekTo(progress);
- }
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
-
- }
-
- //播放控制的按鈕事件
- class MyClickListener implements OnClickListener{
-
- @Override
- public void onClick(View v) {
- switch(v.getId()){
- case R.id.start:
- play(Environment.getExternalStorageDirectory()+File.separator+"my.mp3");
- break;
- case R.id.pause:
- pause();break;
- case R.id.restart:
- restart();break;
- case R.id.stop:
- stop();break;
- }
- }
-
- }
-
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
-
- //停止播放
- private void stop(){
- if(MainActivity.this.media!=null){
- MainActivity.this.start.setClickable(true);
- MainActivity.this.media.release();
- MainActivity.this.media = null;
- }
- }
-
- //從頭開始播放
- private void restart(){
- if(MainActivity.this.media!=null){
- MainActivity.this.media.seekTo(0);
- }
- }
-
- //暫停獲取繼續(xù)播放
- private void pause(){
- if(MainActivity.this.media==null){
- MainActivity.this.pause.setText("暫停");
- return;
- }
- if("繼續(xù)".equals(MainActivity.this.pause.getText().toString())){
- MainActivity.this.media.start();
- MainActivity.this.pause.setText("暫停");
- }else if(MainActivity.this.media.isPlaying()){
- MainActivity.this.media.pause();
- MainActivity.this.pause.setText("繼續(xù)");
- }
- }
-
- //開始播放
- private void play(String path){
- if(path==null||"".equals(path)){
- Toast.makeText(this, "請選擇播放文件", Toast.LENGTH_SHORT);
- return;
- }
- this.musicName.setText(path.substring(path.lastIndexOf("/")+ 1));
- File file = new File(path);
- if(file.exists()&&file.length()>0){
- try {
- this.media = new MediaPlayer();
- this.media.setAudioStreamType(AudioManager.STREAM_MUSIC);//設(shè)置播放類型
- this.media.setDataSource(path);
- this.media.setOnCompletionListener(new MediaCompletionListener());
- this.media.setOnErrorListener(new MediaErrorListener());
- this.media.prepare();
- this.media.start();
- this.start.setClickable(false);
- //啟動事件更新及進(jìn)度條更新任務(wù),每0.5s更新一次
- MainActivity.this.timer = new Timer();
- MainActivity.this.timer.schedule(new MyTask(), 0, 1000);
- } catch (Exception e) {
- e.printStackTrace();
- Toast.makeText(this, "播放文件錯誤", Toast.LENGTH_SHORT).show();
- }
-
- }else{
- Toast.makeText(this, "播放文件不存在", Toast.LENGTH_SHORT).show();
- }
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- if(this.media != null) { //如果播放器對象不為空
- this.media.release(); //釋放播放器資源
- this.media = null; //設(shè)置對象為空
- }
- }
-
- @SuppressLint("HandlerLeak")
- private Handler handler = new Handler() {
- public void handleMessage(Message msg) {
- switch(msg.what) {
- case 1:
- if(MainActivity.this.media != null) {
- int progress = MainActivity.this.media.getCurrentPosition(); //當(dāng)前播放毫秒
- int allTime = MainActivity.this.media.getDuration(); //總毫秒
- MainActivity.this.seekbar.setMax(allTime);//設(shè)置進(jìn)度條
- MainActivity.this.startTime.setText(getTimeFormat(progress));
- MainActivity.this.endTime.setText(getTimeFormat(allTime));
- MainActivity.this.seekbar.setProgress(progress);
- }
- break;
- case 2:
- break;
- case 3:
- addList();
- break;
- }
-
- super.handleMessage(msg);
- }
- };
-
- private String getTimeFormat(int time) {
- String timeStr = "00:00:00";
- int s = time/1000; //秒
- int h = s / 3600; //求整數(shù)部分 ,小時
- int r = s % 3600; //求余數(shù)
- int m = 0;
- if(r > 0) {
- m = r / 60; //分
- r = r % 60; //求分后的余數(shù),即為秒
- }
-
- if(h < 10) {
- timeStr = "0" + h;
- } else {
- timeStr = "" + h;
- }
-
- if(m < 10) {
- timeStr = timeStr + ":" + "0" + m;
- } else {
- timeStr = timeStr + ":" + m;
- }
-
- if(r < 10) {
- timeStr = timeStr + ":" + "0" + r;
- } else {
- timeStr = timeStr + ":" + r;
- }
-
- return timeStr;
- }
-
-
- private class MyTask extends TimerTask {
-
- @Override
- public void run() {
- Message message = new Message();
- message.what = 1;
- MainActivity.this.handler.sendMessage(message);
- }
- }
-
- //播放時候錯誤回調(diào)
- private class MediaErrorListener implements OnErrorListener{
- @Override
- public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
- MainActivity.this.media.stop();
- MainActivity.this.media.release();
- MainActivity.this.media = null;
- Toast.makeText(MainActivity.this, "播放時候遇到錯誤,播放停止", Toast.LENGTH_LONG).show();
- return false;
- }
- }
- //播放完成事件
- private class MediaCompletionListener implements OnCompletionListener{
- @Override
- public void onCompletion(MediaPlayer arg0) {
- MainActivity.this.media.stop();
- MainActivity.this.media.release();
- MainActivity.this.media = null;
- MainActivity.this.musicName.setText("當(dāng)前沒有播放");
- MainActivity.this.startTime.setText("00:00");
- MainActivity.this.endTime.setText("00:00");
- MainActivity.this.start.setClickable(true);
- }
-
- }
- }
復(fù)制代碼
MyMp3.rar
(1.22 MB, 下載次數(shù): 12)
2015-07-06 14:35 上傳
點擊文件名下載附件
1.gif (9.46 KB, 下載次數(shù): 101)
下載附件
2015-07-06 14:36 上傳
|
|