基本信息
源码名称:android音乐播放器 源码下载(可扫描本地歌曲)
源码大小:1.61M
文件格式:.zip
开发语言:Java
更新时间:2016-12-25
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

package com.example.audioplayer;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;

import com.example.audioplayer.MusicListAdapter.OnItemClickListener;
import com.example.autioplayer.R;

import android.R.integer;
import android.R.string;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.IntentFilter;
import android.content.Intent;
import android.support.v4.app.TaskStackBuilder;
import android.support.v4.app.TaskStackBuilderHoneycomb;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;

public class PlayerActivity extends Activity {
	private static Intent startIntent;
	private int playState;
	private SeekBar seekBar;
	private TextView text_prompt;
	private TextView text_listnfo;
	private TextView text_sonName;
	private TextView text_currentTime;
	private TextView text_seekTime;
	private TextView text_duration;
	private ImageView image_setloopMode;
	private MusicListAdapter musicListAdapter;
	private int current_id;
	private int currentTime;
	private int duration;
	private int playMode = 3;			//播放状态,默认为顺序播放
	private boolean canSeek = true;
	private Toast mToast;
	private List<AudioInfo> audioList;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player);
        initialize();
    }


    private void initialize() {
    	
    	initializeBroadcast();
		initializeView();
		
		if(startIntent == null)
		{
			startIntent = new Intent();
			startIntent.setAction("com.example.audioplayer.PLAYER_SERVICE");
			startService(startIntent);
		}
	}
    
    private void initializeView() {
    	findViewById(R.id.imageView_btn_play_or_pause).setOnClickListener(new ButtonClick());
		findViewById(R.id.imageView_btn_stop).setOnClickListener(new ButtonClick());
		findViewById(R.id.imageView_btn_back_last).setOnClickListener(new ButtonClick());
		findViewById(R.id.imageView_btn_forward_next).setOnClickListener(new ButtonClick());
		text_prompt = (TextView)findViewById(R.id.text_prompt);
		text_listnfo = (TextView)findViewById(R.id.text_list_info);
		text_sonName = (TextView)findViewById(R.id.text_song_name);
		text_currentTime = (TextView)findViewById(R.id.text_current_time);
		text_duration = (TextView)findViewById(R.id.text_duration);
		text_seekTime = (TextView)findViewById(R.id.text_seekTime);
		image_setloopMode = (ImageView)findViewById(R.id.image_setloopMode);
		image_setloopMode.setOnClickListener(new ButtonClick());
		setPlayMode(playMode);
		seekBar = (SeekBar) findViewById(R.id.seekBar);
		seekBar.setOnSeekBarChangeListener(new ChangeListener());
		ListView musicList = (ListView)findViewById(R.id.musiic_list);
		audioList = AudioFileService.getAudioInfolist(getApplicationContext());
		musicListAdapter = new MusicListAdapter(getApplicationContext(), audioList);
		musicList.setAdapter(musicListAdapter);
		musicListAdapter.SetOnListItemClickListener(new OnItemClickListener(){

			@Override
			public void OnClick(int position) {
				// TODO Auto-generated method stub
				Intent controlIntent = new Intent();
				controlIntent.setAction(AppConstant.BroadcastAction.CTL_ACTION);
				controlIntent.putExtra("control", AppConstant.PlayerMsg.PLAY_LIST_BY_POS);
				controlIntent.putExtra("position", position);
				//发送普通广播
				sendBroadcast(controlIntent);
			}
			
		});
	}


	public String getAudioName(int index){
    	if(index >= 0 && index < audioList.size()){
    		String fileName = audioList.get(index).getName();
    		return fileName.substring(0, fileName.lastIndexOf('.'));
    	}
    	return "";
    };


	@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;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_rescan) {
        	Intent controlIntent = new Intent();
			controlIntent.setAction(AppConstant.BroadcastAction.CTL_ACTION);
			controlIntent.putExtra("control", AppConstant.PlayerMsg.REQUEST_RELOAD);
			sendBroadcast(controlIntent);
            return true;
        }
        
        if (id == R.id.action_exit) {
        	stopPlayerService();
        	finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
    
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            quit();
        }
        return false;
    }
    
    public void quit(){
    	// 创建退出对话框
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(
                this);
        // 设置对话框标题
        dialogBuilder.setTitle("提示");
        // 设置对话框消息
        dialogBuilder.setMessage("确定要退出吗?");
        // 添加选择按钮并注册监听
        dialogBuilder.setNeutralButton("确定",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                    	stopPlayerService();
                        finish();
                    }
                });
        dialogBuilder.setNegativeButton("取消", null);
        // 显示对话框
        dialogBuilder.create().show();
    }
    
    protected void stopPlayerService() {
    	Intent controlIntent = new Intent();
    	controlIntent.setAction(AppConstant.BroadcastAction.CTL_ACTION);
		controlIntent.putExtra("control", AppConstant.PlayerMsg.STOP_MSG);
		new Handler().postDelayed(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				if(startIntent != null)
				{
					startIntent = new Intent();
					startIntent.setAction("com.example.audioplayer.PLAYER_SERVICE");
					stopService(startIntent);
					startIntent = null;
				}
				
			}
		}, 500);
    	
	}
    
    public void setButtonIcon(int playSate) {
		ImageView imageView = (ImageView)findViewById(R.id.imageView_btn_play_or_pause);
		if(playSate == AppConstant.PlayState.PLAYING)
			imageView.setImageResource(R.drawable.btn_pause);
		else
			imageView.setImageResource(R.drawable.btn_play);
	}
    
    public void setPlayMode(int playMode) {
    	Intent controlIntent = new Intent();
		controlIntent.setAction(AppConstant.BroadcastAction.CTL_ACTION);
		controlIntent.putExtra("control", AppConstant.PlayerMsg.PLAY_MODE_CHANGE);
		controlIntent.putExtra("palayMode", playMode);
		sendBroadcast(controlIntent);
		int ids[] = {R.drawable.image_songlop_play, R.drawable.image_listloop_play,
				R.drawable.image_order_play, R.drawable.image_random_play};
		String prompts[] = {"单曲循环", "列表循环", "顺序播放", "随机播放"};
		showToast(prompts[playMode-1]);
		image_setloopMode.setImageResource(ids[playMode-1]);
	}

	class ButtonClick implements android.view.View.OnClickListener{

		@Override
		public void onClick(View v) {
			Intent controlIntent = new Intent();
			switch (v.getId()) {
			case R.id.imageView_btn_play_or_pause:
				//设置Intent的Action属性
				controlIntent.setAction(AppConstant.BroadcastAction.CTL_ACTION);
				controlIntent.putExtra("control", AppConstant.PlayerMsg.PLAY_MSG);
				break;
			case R.id.imageView_btn_stop:
				//设置Intent的Action属性
				controlIntent.setAction(AppConstant.BroadcastAction.CTL_ACTION);
				controlIntent.putExtra("control", AppConstant.PlayerMsg.STOP_MSG);
				
				break;
			case R.id.imageView_btn_back_last:
				//设置Intent的Action属性
				controlIntent.setAction(AppConstant.BroadcastAction.CTL_ACTION);
				controlIntent.putExtra("control", AppConstant.PlayerMsg.PRIVIOUS_MSG);
				break;
			case R.id.imageView_btn_forward_next:
				//设置Intent的Action属性
				controlIntent.setAction(AppConstant.BroadcastAction.CTL_ACTION);
				controlIntent.putExtra("control", AppConstant.PlayerMsg.NEXT_MSG);
				break;
			case R.id.image_setloopMode:
				  playMode;
				if(playMode > 4)
					playMode = 1;
				setPlayMode(playMode);
				break;
			default:
				break;
			}
			//发送普通广播
			sendBroadcast(controlIntent);
		}
    	
    }
	
	
	public void initializeBroadcast(){
		BroadcastReceiver updateReceiver = new BroadcastReceiver() {
			Handler handler;
			Runnable runnable;
			@Override
			public void onReceive(Context context, Intent intent) {
				playState = intent.getIntExtra("playState", 0);
				current_id = intent.getIntExtra("MUSIC_ID", 0);
				setButtonIcon(playState);				
				int listSize = 0;
				if(audioList != null)
					listSize = audioList.size();
				text_listnfo.setText((listSize > 0?current_id 1:0) " / " listSize);
				text_sonName.setText(getAudioName(current_id));
				if(listSize == 0){
					text_currentTime.setText("00:00");
					text_duration.setText("00:00");
				}
				
				if(intent.getBooleanExtra("loading", false)){
					text_prompt.setText("正在扫描本地音乐,已经找到" listSize "首歌曲");
					musicListAdapter.notifyDataSetChanged();
					System.out.println("---------------------------------");
				}
				else if(intent.getBooleanExtra("loaded", false)){
					text_prompt.setText("共找到" listSize "首音乐");
					if(handler != null){
						handler.removeCallbacks(runnable);  
					}
					colsePrompt();
				}
			}
			
			protected void colsePrompt() {
				handler = new Handler();
				runnable = new Runnable(){
				     public void run() {
				    	 text_prompt.setText("");
				     }
				};
				handler.postDelayed(runnable, 3000);
			}
		};
		registerBoradcastReceiver(updateReceiver, AppConstant.BroadcastAction.UPDATE_ACTION);
		
		BroadcastReceiver musicCurrentReceiver = new BroadcastReceiver() {
			
			@Override
			public void onReceive(Context context, Intent intent) {
				currentTime = intent.getIntExtra("currentTime", 0);
				if(duration > 0 && canSeek)
					seekBar.setProgress((int)(100.0f * currentTime / duration));
				text_currentTime.setText(getTimeString(currentTime));
			}
		};
		registerBoradcastReceiver(musicCurrentReceiver, AppConstant.BroadcastAction.MUSIC_CURRENT_TIME);
		
		BroadcastReceiver musicDurationReceiver = new BroadcastReceiver() {
			
			@Override
			public void onReceive(Context context, Intent intent) {
				duration = intent.getIntExtra("duration", 0);
				text_duration.setText(getTimeString(duration));
			}
		};
		registerBoradcastReceiver(musicDurationReceiver, AppConstant.BroadcastAction.MUSIC_DURATION);
	}


	public void registerBoradcastReceiver(BroadcastReceiver mBroadcastReceiver, String ACTION_NAME){  
        IntentFilter myIntentFilter = new IntentFilter();
        myIntentFilter.addAction(ACTION_NAME);
        //注册广播 
        registerReceiver(mBroadcastReceiver, myIntentFilter);
    }
	
	class ChangeListener implements OnSeekBarChangeListener {
		int time;
        /**
         * 拖动条停止拖动的时候调用
         */
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        	text_seekTime.setText("");
        	currentTime = this.time;
        	setPlaySeek(currentTime);
        	canSeek = true;
        }

        /**
         * 拖动条开始拖动的时候调用
         */
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        	canSeek = false;
        }

        /**
         * 拖动条进度改变的时候调用
         */
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        	if(!canSeek) {
	        	this.time = (int)(progress / 100.0f * duration);
	        	text_seekTime.setText(getTimeString(this.time));
        	}
        }
    }


	public void setPlaySeek(int seek) {
		Intent controlIntent = new Intent();
		controlIntent.setAction(AppConstant.BroadcastAction.CTL_ACTION);
		controlIntent.putExtra("control", AppConstant.PlayerMsg.PROGRESS_CHANGE);
		controlIntent.putExtra("progress", seek);
		sendBroadcast(controlIntent);
	};
	
	/**
	 * 显示Toast
	 */
	private void showToast(String msg){
        if(mToast == null){
            mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
        }else{
            mToast.setText(msg);
        }
        mToast.show();
    }
	
	private String getTimeString(int time_ms) {
		time_ms = time_ms / 1000;
		return String.format("%02d:%02d", time_ms / 60, time_ms % 60);
	}
    
}