音乐播放器

主要用到MediaPlayer和 TelephonyManager 两个类。主要用于监听电话状态,接听时暂停,挂断时继续播放。,同时设置暂停标识,播放,暂停,继续这些操作API应该放到服务中


public class MainActivity extends Activity {
    private EditText nameText;
    private String path;
    private MediaPlayer mediaPlayer;
    private boolean pause;
    private int position;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mediaPlayer = new MediaPlayer();
        nameText = (EditText) this.findViewById(R.id.filename);
        
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        telephonyManager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
    }   
    private final class MyPhoneListener extends PhoneStateListener{
		public void onCallStateChanged(int state, String incomingNumber) {
			switch (state) {
			case TelephonyManager.CALL_STATE_RINGING://来电
				if(mediaPlayer.isPlaying()) {
					position = mediaPlayer.getCurrentPosition();
					mediaPlayer.stop();
				}
				break;

			case TelephonyManager.CALL_STATE_IDLE:
				if(position>0 && path!=null){
					play(position);
					position = 0;
				}
				break;
			}
		}
    }

以下生命周期方法用于不在前台时候调用的,比如说有个电话打来,或者打开别的应用,可以继续听歌。注意在OnDestroy()方法中将MediaPlayer释放

   
 /*
    @Override
	protected void onPause() {
		if(mediaPlayer.isPlaying()) {
			position = mediaPlayer.getCurrentPosition();
			mediaPlayer.stop();
		}
		super.onPause();
	}


	@Override
	protected void onResume() {
		if(position>0 && path!=null){
			play(position);
			position = 0;
		}
		super.onResume();
	}
*/
	@Override
	protected void onDestroy() {
    	mediaPlayer.release();
    	mediaPlayer = null;
		super.onDestroy();
	}


该方法主要是用于在SDCard根目录下寻找文件。
File audio = new File(Environment.getExternalStorageDirectory(), filename);
			if(audio.exists()){
				path = audio.getAbsolutePath();
				play(0);

注意可以用

position = mediaPlayer.getCurrentPosition();

这个方法获得播放位置

public void mediaplay(View v){
    	switch (v.getId()) {
		case R.id.playbutton:
			String filename = nameText.getText().toString();
			File audio = new File(Environment.getExternalStorageDirectory(), filename);
			if(audio.exists()){
				path = audio.getAbsolutePath();
				play(0);
			}else{
				path = null;
				Toast.makeText(getApplicationContext(), R.string.filenoexist, 1).show();
			}
			break;
			
		case R.id.pausebutton:
			if(mediaPlayer.isPlaying()){
				mediaPlayer.pause();//暂停
				pause = true;
				((Button)v).setText(R.string.continues);
			}else{
				if(pause){
					mediaPlayer.start();//继续播放
					pause = false;
					((Button)v).setText(R.string.pausebutton);
				}
			}
			break;
		case R.id.resetbutton:
			if(mediaPlayer.isPlaying()){
				mediaPlayer.seekTo(0);//从开始位置播放音乐
			}else{
				if(path!=null){
					play(0);
				}
			}
			break;
		case R.id.stopbutton:	
			if(mediaPlayer.isPlaying()) mediaPlayer.stop();
			break;
		}
    }


	private void play(int position) {
		try {
			mediaPlayer.reset();//把各项参数恢复到初始状态
			mediaPlayer.setDataSource(path);
			mediaPlayer.prepare();//进行缓冲
			mediaPlayer.setOnPreparedListener(new PrepareListener(position));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private final class PrepareListener implements OnPreparedListener{
		private int position;
		public PrepareListener(int position) {
			this.position = position;
		}
		public void onPrepared(MediaPlayer mp) {
			mediaPlayer.start();//开始播放
			if(position>0) mediaPlayer.seekTo(position);
		}
	}
}

获得监听电话权限

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值