亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1506 | 回復(fù): 2
打印 上一主題 下一主題

[Android] 安卓簡單mp3播放器 [復(fù)制鏈接]

論壇徽章:
1
操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-07-07 22:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-07-06 14:36 |只看該作者 |倒序瀏覽
使用MediaPlayer播放mp3,mp3文件使用線程搜索出來,并顯示在列表上,點擊列表播放
按鈕有4個,可以控制暫停,播放,重新播放,停止。
進(jìn)度條可以監(jiān)控播放進(jìn)度,也可以拖動進(jìn)度條快進(jìn),快退功能。

[Java]代碼
  1. package com.yongzheng.mymusic;

  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.Timer;
  9. import java.util.TimerTask;

  10. import android.media.AudioManager;
  11. import android.media.MediaPlayer;
  12. import android.media.MediaPlayer.OnCompletionListener;
  13. import android.media.MediaPlayer.OnErrorListener;
  14. import android.media.MediaPlayer.OnPreparedListener;
  15. import android.os.Bundle;
  16. import android.os.Environment;
  17. import android.os.Handler;
  18. import android.os.Message;
  19. import android.annotation.SuppressLint;
  20. import android.app.Activity;
  21. import android.content.DialogInterface;
  22. import android.view.Menu;
  23. import android.view.View;
  24. import android.view.View.OnClickListener;
  25. import android.widget.AdapterView;
  26. import android.widget.AdapterView.OnItemClickListener;
  27. import android.widget.Button;
  28. import android.widget.ListView;
  29. import android.widget.SeekBar;
  30. import android.widget.SimpleAdapter;
  31. import android.widget.TextView;
  32. import android.widget.Toast;

  33. public class MainActivity extends Activity{
  34.      
  35.     private TextView musicName ;//歌曲名稱
  36.     private TextView startTime;//播放時間
  37.     private TextView endTime;//結(jié)束時間
  38.     private SeekBar seekbar;//進(jìn)度條
  39.      
  40.     private Button start;//開始按鈕
  41.     private Button pause;//暫停按鈕
  42.     private Button restart;//重新開始
  43.     private Button stop;//停止按鈕
  44.      
  45.     private ListView mylist;//列表
  46.     private SimpleAdapter adapter = null;   // 適配器
  47.      
  48.     private Timer timer;
  49.      
  50.     private MediaPlayer media = null;
  51.     private List<Map<String, String>> musicListData;
  52.      
  53.     private String lastPlayName = null;//記錄最后一次播放的歌曲
  54.      
  55.     @Override
  56.     protected void onCreate(Bundle savedInstanceState) {
  57.         super.onCreate(savedInstanceState);
  58.         setContentView(R.layout.activity_main);
  59.         init();
  60.     }

  61.     //初始化
  62.     private void init(){
  63.          
  64.         musicListData =
  65.                 new ArrayList<Map<String, String>>();   // 保存所有的List數(shù)據(jù)
  66.          
  67.         this.musicName = (TextView) this.findViewById(R.id.musicName);
  68.         this.startTime = (TextView)this.findViewById(R.id.startTime);
  69.         this.endTime = (TextView)this.findViewById(R.id.endTime);
  70.         this.seekbar = (SeekBar)this.findViewById(R.id.seekbar);
  71.         this.start = (Button)this.findViewById(R.id.start);
  72.         this.pause = (Button)this.findViewById(R.id.pause);
  73.         this.restart = (Button)this.findViewById(R.id.restart);
  74.         this.stop = (Button)this.findViewById(R.id.stop);
  75.         this.mylist = (ListView)this.findViewById(R.id.mylist);
  76.         addList();
  77.         //點擊事件
  78.         this.start.setOnClickListener(new MyClickListener());
  79.         this.pause.setOnClickListener(new MyClickListener());
  80.         this.restart.setOnClickListener(new MyClickListener());
  81.         this.stop.setOnClickListener(new MyClickListener());
  82.          
  83.         this.seekbar.setOnSeekBarChangeListener(new SeekBarOnClickListenerImpl());
  84.         //開啟搜索sd卡中MP3文件的線程
  85.         new Thread(){
  86.         public void run(){
  87.             getMusicDate();//搜索sd卡下面的mp3后綴的文件
  88.         }
  89.     }.start();
  90.     }
  91.      
  92.     //待搜索線程完成后,執(zhí)行這個添加數(shù)據(jù)到界面上
  93.     public void addList(){
  94.         this.adapter = new SimpleAdapter(this,this.musicListData,R.layout.list,
  95.                 new String[]{"name","size"},new int[]{R.id.name,R.id.size});
  96.         this.mylist.setAdapter(adapter);
  97.         this.mylist.setOnItemClickListener(new OnItemClickListener() {
  98.             @Override
  99.             public void onItemClick(AdapterView<?> adapt, View v, int postition,
  100.                     long id) {
  101.                 Map<String,String> map = MainActivity.this.musicListData.get(postition);
  102.                 if(MainActivity.this.media!=null){
  103.                     stop();
  104.                 }
  105.                 play(map.get("path"));
  106.             }
  107.         });
  108.     }
  109.      
  110.     //獲取播放列表
  111.     public void getMusicDate(){
  112.          
  113.         if(!(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))){
  114.             //如果不sd卡存在
  115.             return;
  116.         }
  117.         File rootPath = Environment.getExternalStorageDirectory();
  118.         File[] listFile = rootPath.listFiles();
  119.         if(listFile!=null){
  120.             for(File f : listFile){
  121.                 if(f.isDirectory()){//如果是目錄
  122.                     System.out.println("根文件夾:"+f.getName());
  123.                     getFile(f);
  124.                 }else{//如果是文件
  125.                     getAFile(f);
  126.                 }
  127.             }
  128.         }
  129.          
  130.         Message message = new Message();
  131.         message.what = 3;
  132.         MainActivity.this.handler.sendMessage(message);
  133.         return;
  134.     }
  135.      
  136.     //文件
  137.     private void getAFile(File f){
  138.         String fName = f.getName();
  139.         if(!fName.endsWith("mp3")){
  140.             return;
  141.         }
  142.         Map<String,String> map = new HashMap<String,String>();
  143.         map.put("name",fName);
  144.         map.put("size", String.valueOf(f.length()/1024/1024)+"MB");
  145.         map.put("path",f.getAbsolutePath());
  146.         musicListData.add(map);
  147.         System.out.println("音樂文件路徑:"+f.getAbsolutePath());
  148.     }
  149.     //路徑
  150.     private void getFile(File f){
  151.         if(!f.isDirectory()){
  152.             getAFile(f);
  153.             return;
  154.         }
  155.         File[] listFile = f.listFiles();
  156.         if(listFile!=null){
  157.             for(File ff : listFile){
  158.                 if(f.isDirectory()){//如果是目錄
  159.                     System.out.println("文件夾:"+ff.getName());
  160.                     getFile(ff);
  161.                 }else{//如果是文件
  162.                     System.out.println("文件:"+ff.getName());
  163.                     getAFile(ff);
  164.                 }
  165.             }
  166.         }
  167.     }
  168.      
  169.     //進(jìn)度條監(jiān)聽回調(diào)
  170.     private class SeekBarOnClickListenerImpl implements SeekBar.OnSeekBarChangeListener {

  171.         @Override
  172.         public void onProgressChanged(SeekBar seekBar, int progress,
  173.                 boolean fromUser) {
  174.             if(!fromUser)return;
  175.             if(MainActivity.this.media!=null){
  176.                  
  177.                 Message message = new Message();
  178.                 Bundle b = new Bundle();
  179.                 b.putInt("p", progress);
  180.                 message.setData(b);
  181.                 message.what = 2;
  182.                 MainActivity.this.handler.sendMessage(message);
  183.                 MainActivity.this.media.seekTo(progress);
  184.             }      
  185.         }

  186.         @Override
  187.         public void onStartTrackingTouch(SeekBar seekBar) {
  188.             // TODO Auto-generated method stub
  189.             
  190.         }

  191.         @Override
  192.         public void onStopTrackingTouch(SeekBar seekBar) {
  193.             
  194.         }

  195.     }
  196.      
  197.     //播放控制的按鈕事件
  198.     class MyClickListener implements OnClickListener{

  199.         @Override
  200.         public void onClick(View v) {
  201.             switch(v.getId()){
  202.                 case R.id.start:
  203.                     play(Environment.getExternalStorageDirectory()+File.separator+"my.mp3");
  204.                     break;
  205.                 case R.id.pause:
  206.                     pause();break;
  207.                 case R.id.restart:
  208.                     restart();break;
  209.                 case R.id.stop:
  210.                     stop();break;
  211.             }
  212.         }
  213.          
  214.     }
  215.      
  216.      
  217.     @Override
  218.     public boolean onCreateOptionsMenu(Menu menu) {
  219.         // Inflate the menu; this adds items to the action bar if it is present.
  220.         getMenuInflater().inflate(R.menu.main, menu);
  221.         return true;
  222.     }

  223.     //停止播放
  224.     private void stop(){
  225.         if(MainActivity.this.media!=null){
  226.             MainActivity.this.start.setClickable(true);
  227.             MainActivity.this.media.release();
  228.             MainActivity.this.media = null;
  229.         }
  230.     }
  231.      
  232.     //從頭開始播放
  233.     private void restart(){
  234.         if(MainActivity.this.media!=null){
  235.             MainActivity.this.media.seekTo(0);
  236.         }
  237.     }
  238.      
  239.     //暫停獲取繼續(xù)播放
  240.     private void pause(){
  241.         if(MainActivity.this.media==null){
  242.             MainActivity.this.pause.setText("暫停");
  243.             return;
  244.         }
  245.         if("繼續(xù)".equals(MainActivity.this.pause.getText().toString())){
  246.             MainActivity.this.media.start();
  247.             MainActivity.this.pause.setText("暫停");
  248.         }else if(MainActivity.this.media.isPlaying()){
  249.             MainActivity.this.media.pause();
  250.             MainActivity.this.pause.setText("繼續(xù)");
  251.         }
  252.     }

  253.     //開始播放
  254.     private void play(String path){
  255.         if(path==null||"".equals(path)){
  256.             Toast.makeText(this, "請選擇播放文件", Toast.LENGTH_SHORT);
  257.             return;
  258.         }
  259.         this.musicName.setText(path.substring(path.lastIndexOf("/")+ 1));
  260.         File file = new File(path);
  261.         if(file.exists()&&file.length()>0){
  262.             try {
  263.                 this.media = new MediaPlayer();
  264.                 this.media.setAudioStreamType(AudioManager.STREAM_MUSIC);//設(shè)置播放類型
  265.                 this.media.setDataSource(path);
  266.                 this.media.setOnCompletionListener(new MediaCompletionListener());
  267.                 this.media.setOnErrorListener(new MediaErrorListener());
  268.                 this.media.prepare();
  269.                 this.media.start();
  270.                 this.start.setClickable(false);
  271.                 //啟動事件更新及進(jìn)度條更新任務(wù),每0.5s更新一次
  272.                 MainActivity.this.timer = new Timer();
  273.                 MainActivity.this.timer.schedule(new MyTask(), 0, 1000);
  274.             } catch (Exception e) {
  275.                 e.printStackTrace();
  276.                 Toast.makeText(this, "播放文件錯誤", Toast.LENGTH_SHORT).show();
  277.             }
  278.             
  279.         }else{
  280.             Toast.makeText(this, "播放文件不存在", Toast.LENGTH_SHORT).show();
  281.         }
  282.     }
  283.      
  284.     @Override
  285.     protected void onDestroy() {
  286.         super.onDestroy();
  287.             
  288.         if(this.media != null) {  //如果播放器對象不為空
  289.             this.media.release();    //釋放播放器資源
  290.             this.media = null;        //設(shè)置對象為空
  291.         }
  292.     }
  293.      
  294.     @SuppressLint("HandlerLeak")
  295.     private Handler handler = new Handler() {
  296.         public void handleMessage(Message msg) {
  297.             switch(msg.what) {
  298.             case 1:
  299.                 if(MainActivity.this.media != null) {
  300.                     int progress = MainActivity.this.media.getCurrentPosition();  //當(dāng)前播放毫秒
  301.                     int allTime = MainActivity.this.media.getDuration();      //總毫秒            
  302.                     MainActivity.this.seekbar.setMax(allTime);//設(shè)置進(jìn)度條
  303.                     MainActivity.this.startTime.setText(getTimeFormat(progress));
  304.                     MainActivity.this.endTime.setText(getTimeFormat(allTime));
  305.                     MainActivity.this.seekbar.setProgress(progress);
  306.                 }
  307.                 break;
  308.             case 2:
  309.                 break;
  310.             case 3:
  311.                 addList();
  312.                 break;
  313.             }
  314.             
  315.             super.handleMessage(msg);
  316.         }
  317.     };
  318.      
  319.     private String getTimeFormat(int time) {
  320.         String timeStr = "00:00:00";
  321.         int s = time/1000;   //秒
  322.         int h = s / 3600;    //求整數(shù)部分 ,小時
  323.         int r = s % 3600;    //求余數(shù)
  324.         int m = 0;
  325.         if(r > 0) {
  326.             m = r / 60;    //分
  327.             r = r % 60;    //求分后的余數(shù),即為秒
  328.         }
  329.          
  330.         if(h < 10) {
  331.             timeStr = "0" + h;
  332.         } else {
  333.             timeStr = "" + h;
  334.         }
  335.          
  336.         if(m < 10) {
  337.             timeStr = timeStr + ":" + "0" + m;
  338.         } else {
  339.             timeStr = timeStr + ":" + m;
  340.         }
  341.          
  342.         if(r < 10) {
  343.             timeStr = timeStr + ":" + "0" + r;
  344.         } else {
  345.             timeStr = timeStr + ":" + r;
  346.         }
  347.          
  348.         return timeStr;
  349.     }

  350.      
  351.     private class MyTask extends TimerTask {

  352.         @Override
  353.         public void run() {
  354.             Message message = new Message();
  355.             message.what = 1;
  356.             MainActivity.this.handler.sendMessage(message);
  357.         }      
  358.     }

  359.     //播放時候錯誤回調(diào)
  360.     private class MediaErrorListener implements OnErrorListener{
  361.         @Override
  362.         public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
  363.             MainActivity.this.media.stop();
  364.             MainActivity.this.media.release();
  365.             MainActivity.this.media = null;
  366.             Toast.makeText(MainActivity.this, "播放時候遇到錯誤,播放停止", Toast.LENGTH_LONG).show();
  367.             return false;
  368.         }
  369.     }
  370.     //播放完成事件
  371.     private class MediaCompletionListener implements OnCompletionListener{
  372.         @Override
  373.         public void onCompletion(MediaPlayer arg0) {
  374.             MainActivity.this.media.stop();
  375.             MainActivity.this.media.release();
  376.             MainActivity.this.media = null;
  377.             MainActivity.this.musicName.setText("當(dāng)前沒有播放");
  378.             MainActivity.this.startTime.setText("00:00");
  379.             MainActivity.this.endTime.setText("00:00");
  380.             MainActivity.this.start.setClickable(true);
  381.         }
  382.          
  383.     }
  384. }
復(fù)制代碼
MyMp3.rar (1.22 MB, 下載次數(shù): 12)

論壇徽章:
59
2015七夕節(jié)徽章
日期:2015-08-24 11:17:25ChinaUnix專家徽章
日期:2015-07-20 09:19:30每周論壇發(fā)貼之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38榮譽版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年紀(jì)念徽章
日期:2015-07-20 11:05:27IT運維版塊每日發(fā)帖之星
日期:2015-07-20 11:05:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-07-20 11:05:36程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-20 11:05:40數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-07-20 11:05:432015年辭舊歲徽章
日期:2015-07-20 11:05:44
2 [報告]
發(fā)表于 2015-07-11 20:56 |只看該作者
支持后臺播放就更好了。

論壇徽章:
80
20周年集字徽章-慶
日期:2020-10-28 14:09:1215-16賽季CBA聯(lián)賽之北京
日期:2020-10-28 13:32:5315-16賽季CBA聯(lián)賽之北控
日期:2020-10-28 13:32:4815-16賽季CBA聯(lián)賽之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
3 [報告]
發(fā)表于 2015-07-14 10:26 |只看該作者
樓主把他做成一個服務(wù)的形式就可以了。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP