我自己的音乐播放器

主ACTIVITY

package wang.test;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
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.ImageButton;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SimpleAdapter;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;

public class MusicPlayerActivity extends Activity implements OnClickListener {
    private ImageButton play,stop,next;
    private Button returnpath;
    private TextView musictime,musicname,SDPath,playname;
    private SeekBar    sb;
    private ListView listView;
    private Myreceive myreceive;
    private int playtime=0,time=0;
    private File file;
    private File[] musicfiles;
    private static final int PLAY_ID=1,STOP_ID=2,NEXT_ID=3,SEEKBAR_ID=4,PAUSE_ID=5,ITEM_ID=6;
    private Intent intentlist=new Intent("wang.test.pathlist");
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //获得控件ID
        play=(ImageButton)findViewById(R.id.imageButton1);
        stop=(ImageButton)findViewById(R.id.imageButton2);
        next=(ImageButton)findViewById(R.id.imageButton3);
        returnpath=(Button)findViewById(R.id.button1);
        musicname=(TextView)findViewById(R.id.musicname);
        musictime=(TextView)findViewById(R.id.musictime);
        playname=(TextView)findViewById(R.id.textView2);
        SDPath=(TextView)findViewById(R.id.textView4);
        sb=(SeekBar)findViewById(R.id.seekBar1);
        listView=(ListView)findViewById(R.id.listView1);
        //监听按钮
        play.setOnClickListener(this);
        stop.setOnClickListener(this);
        next.setOnClickListener(this);
        //注册广播和启动服务
        Intent intent=new Intent(this, PlayService.class);
     
        startService(intent);
      
        //文件浏览
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            file=Environment.getExternalStorageDirectory();
            musicfiles=file.listFiles();
            inflateListView(musicfiles);
             
        }
        //按键更改图标的广播
        myreceive=new Myreceive();
        IntentFilter filter=new IntentFilter("wang.test.returnAction");
        registerReceiver(myreceive, filter);
        //更新进度条和播放时间的广播
       MyThreadUI threadUI=new MyThreadUI();
       IntentFilter filter2=new IntentFilter("wang.test.returntask");
       registerReceiver(threadUI, filter2);
       //获取播放歌曲最大时间的广播,用于设定进度条最大值
       Mymusictime mymusictime=new Mymusictime();
       IntentFilter filter3=new IntentFilter("wang.test.returntime");
       registerReceiver(mymusictime, filter3);
       sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
        Intent intent=new Intent("wang.test.buttonAction");
        Bundle b=new Bundle();
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub
            b.putInt("ID", SEEKBAR_ID);
            b.putInt("position", sb.getProgress());
            intent.putExtra("data", b);
            sendBroadcast(intent);
        }
       
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub
           
        }
       
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            // TODO Auto-generated method stub
           
        }
       
    });
    }
   
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent intent=new Intent("wang.test.buttonAction");
         final Bundle b=new Bundle();
        switch (v.getId()) {
        case R.id.imageButton1:
            b.putInt("ID", PLAY_ID);
            break;
        case R.id.imageButton2:
            b.putInt("ID", STOP_ID);
            break;
        case R.id.imageButton3:
            b.putInt("ID", NEXT_ID);
           
            break;
        }
        //进度条监听事件
       
        intent.putExtra("data", b);
        sendBroadcast(intent);
       
    }
   
    //接受服务返回的广播
    private class Myreceive extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Bundle b=intent.getBundleExtra("return_data");
           
            switch (b.getInt("return_id")) {
            case PAUSE_ID:
                playname.setText("文件路径:"+b.getString("path"));
            play.setImageResource(R.drawable.pause);
                break;
            case PLAY_ID:
                play.setImageResource(R.drawable.play);
                break;
            }
           
           
        }
       
    }
    private void inflateListView(File[] files)
    {
        // 创建一个List集合,List集合的元素是Map
        final List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
        ArrayList<String> pathlist=new ArrayList<String>();
        for (int i = 0; i < files.length; i++)
        {
            Map<String, Object> listItem = new HashMap<String, Object>();
            //如果当前File是文件夹,使用folder图标;否则使用file图标
            if (files[i].isDirectory())
            {
                listItem.put("icon", R.drawable.folder);
                listItem.put("fileName", files[i].getName());
               
            }
            else if (files[i].isFile()&& files[i].getName().endsWith("mp3") )
            {
                listItem.put("icon", R.drawable.musicicon);
                listItem.put("fileName", files[i].getName());
                try {
                        pathlist.add(files[i].getCanonicalPath());
                       
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            else{
                listItem.put("icon", R.drawable.file);
                listItem.put("fileName", files[i].getName());
            }
            listItems.add(listItem);
       
        }
       
        Bundle b=new Bundle();
        b.putStringArrayList("list", pathlist);
        intentlist.putExtra("listdata", b);
       
       
        // 创建一个SimpleAdapter
   
        SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
            R.layout.listitem, new String[] { "icon", "fileName" }, new int[] {
                R.id.imageView1, R.id.musicname });
        // 为ListView设置Adapter
        listView.setAdapter(simpleAdapter);
        listView.setOnItemClickListener(new OnItemClickListener() {
            Intent intent=new Intent("wang.test.buttonAction");
            Bundle b=new Bundle();
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                if(musicfiles[arg2].isFile() && musicfiles[arg2].getName().endsWith("mp3") ){
                   
                   
                    try {
                        String path=musicfiles[arg2].getCanonicalPath();
                        b.putString("name",path);
                        b.putInt("ID", ITEM_ID);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                   
                    intent.putExtra("data", b);
                    sendBroadcast(intent);
                    sendBroadcast(intentlist);
                }
                if(musicfiles[arg2].isDirectory()){
                File[] temp=musicfiles[arg2].listFiles();
                if(temp==null || temp.length==0){
                    Toast.makeText(getApplicationContext(), "非MP3文件或者当前目录下没有文件", Toast.LENGTH_SHORT).show();
                }
                else{
                    file=musicfiles[arg2];
                    musicfiles=temp;
                    inflateListView(musicfiles);
                }
                }
            }
        });
        returnpath.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    if(!file.getCanonicalPath().equals(Environment.getExternalStorageDirectory().getAbsolutePath())){
                        file=file.getParentFile();
                        musicfiles=file.listFiles();
                        inflateListView(musicfiles);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
    private class MyThreadUI extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Bundle b=intent.getBundleExtra("return_data");
            playtime=b.getInt("playtime");
            sb.setProgress(playtime);
            musictime.setText(getTimeShort(playtime));
        }
        public String getTimeShort(int time) {
               SimpleDateFormat formatter = new SimpleDateFormat("mm:ss");
               String dateString = formatter.format(time);
               return dateString;
            }
    }
    private class Mymusictime extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Bundle b=intent.getBundleExtra("return_data");
            time=b.getInt("time");
            sb.setMax(time);
           
            System.out.println("mmmmmmmmmmmmmmmmm"+time);
        }
       
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK){
            new AlertDialog.Builder(this)
            .setTitle("提示")
            .setMessage("确定退出吗?")
            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
               
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    Intent intent=new Intent(MusicPlayerActivity.this, PlayService.class);
                    stopService(intent);
                    System.exit(0);
                }
            })
            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
               
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                   
                }
            }).create().show();
        }
        return super.onKeyDown(keyCode, event);
    }
}

音乐播放服务类

package wang.test;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class PlayService extends Service {
    private static final int PLAY_ID=1,STOP_ID=2,NEXT_ID=3,SEEKBAR_ID=4,PAUSE_ID=5,ITEM_ID=6;
    private MediaPlayer mp;
    private boolean isplaying=true,ispause=false,isstop=true;
    private Myreceiver myreceiver;
    private ArrayList<String> pathlist=new ArrayList<String>();
    private  String temppath=null ,musicpath=null;
    private TelephonyManager manager;
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        mp=new MediaPlayer();
        //注册按钮广播
        myreceiver=new Myreceiver();
        IntentFilter filter=new IntentFilter("wang.test.buttonAction");
        registerReceiver(myreceiver, filter);
        //注册列表广播
        IntentFilter filter2=new IntentFilter("wang.test.pathlist");
        Myreceiver2 myreceiver2=new Myreceiver2();
        registerReceiver(myreceiver2, filter2);
        //注册电话监听
        manager=(TelephonyManager)this.getSystemService(this.TELEPHONY_SERVICE);
        manager.listen(new MyphoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
        super.onCreate();
       
    }
    //更新播放列表
    private class Myreceiver2 extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Bundle b=intent.getBundleExtra("listdata");
            pathlist=b.getStringArrayList("list");
           
           
        }
       
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
//播放按钮,再点一次暂停
    public void playing(){
        Intent intent=new Intent("wang.test.returnAction");
        Bundle b=new Bundle();
        if(mp!=null){
            if(isplaying==true){
                mp.pause();
                ispause=true;
                isplaying=false;
                b.putInt("return_id", PLAY_ID);
            }
            else if(ispause==true){
                mp.start();
                ispause=false;
                isplaying=true;
                b.putInt("return_id", PAUSE_ID);
               
            }
            else if(isplaying==false && isstop==true){
                try {
                    mp.prepare();
                    mp.start();
                    isplaying=true;
                    isstop=false;
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            b.putInt("time", mp.getDuration());
        }
       
        intent.putExtra("return_data", b);
        sendBroadcast(intent);
    }
    //播放文件
    public void play(String path){
        Intent intent2=new Intent("wang.test.returntime");
        Bundle b2=new Bundle();
        Intent intent=new Intent("wang.test.returnAction");
        Bundle b=new Bundle();
        if(mp!=null){
            mp.reset();
            try {
                mp.setDataSource(path);
                mp.prepare();
                mp.setOnPreparedListener(new OnPreparedListener() {
                   
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        mp.start();
                        isplaying=true;
                        isstop=false;
                   
                    }
                });
                mp.setOnCompletionListener(new OnCompletionListener() {
                   
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        if(isplaying==true){
                            next();
                        }
                    }
                });
            } 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();
            }
            //发回广播更新播放状态以及获取的音乐文件最大值
            b.putString("path", path);
            b.putInt("return_id", PAUSE_ID);
            b2.putInt("time", mp.getDuration());
            intent.putExtra("return_data", b);
            intent2.putExtra("return_data", b2);
            sendBroadcast(intent);
            sendBroadcast(intent2);
            //启动线程更新进度条
            Mythread mythread=new Mythread();
           mythread.execute();
        }
       
   
    }
   
    public void stop(){
        Intent intent=new Intent("wang.test.returnAction");
        Bundle b=new Bundle();
        if(mp!=null){
            mp.stop();
            mp.reset();
            isplaying=false;
            isstop=true;
            b.putInt("return_id", PLAY_ID);
            b.putInt("time", mp.getDuration());
        }
        intent.putExtra("return_data", b);
        sendBroadcast(intent);
    }
    //接收来自按钮的广播
    private class Myreceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Bundle b=intent.getBundleExtra("data");
           
            switch (b.getInt("ID")) {
            case PLAY_ID:
                playing();
               
                break;
            case STOP_ID:
                stop();
               
                break;
            case NEXT_ID:
                next();
                break;
            case SEEKBAR_ID:
                mp.seekTo(b.getInt("position"));
                break;
            case ITEM_ID:
                musicpath=b.getString("name");
                play(musicpath);
           
               
            }
        }
       
    }
    //下一首
    public void next(){
        if(pathlist.size()>0){
            for(int i=0;i<pathlist.size();i++){
                if(pathlist.get(i).equals(musicpath)){
                       if(i+1<pathlist.size()){
                           temppath=pathlist.get(i+1);
                       }
                       else {
                           temppath=pathlist.get(0);
                       }
               
                   
                }
            }
            musicpath=temppath;
            play(musicpath);
            }
    }
    //更新进度条的线程
    private class Mythread extends AsyncTask<Void, Void, Void>{
        Intent intent=new Intent("wang.test.returntask");
        Bundle b=new Bundle();
        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            int i=0;
            if(mp!=null){
            while(i<mp.getDuration()){
                i=mp.getCurrentPosition();
                b.putInt("playtime", i);
                intent.putExtra("return_data", b);
                sendBroadcast(intent);
                try {
               
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               }
           
            }
            return null;
        }
       
    }
    //电话监听
    private class MyphoneListener extends PhoneStateListener{
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                if(mp!=null){
                    mp.pause();
                    ispause=true;
                    isplaying=false;
                }
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                if(mp!=null){
                    mp.start();
                    ispause=false;
                    isplaying=true;
                }
            }
            super.onCallStateChanged(state, incomingNumber);
        }
    }
}

具体作用就是在主页面建立一个SD卡文件浏览器,显示SD卡下面所有的文件,并且给MP3文件设立独立的图标,点击列表就能实现播放


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值