天天看點

簡單的音樂播放器案例

設計大概流程:

①混合方式開啟服務

②在服務的onCreate方法中建立一個mediaplayer 并且準備好

③ 點選播放按鈕開始播放音樂

服務暴露播放暫停方法/ 獲得目前播放狀态的方法

3.1 一個按鈕實作 播放/暫停

3.2 根據播放的狀态修改圖示的狀态

3.3 當activity退出再次進入的時候 根據目前播放狀态更新圖示狀态( onserviceconnected)

④ 進度條展示播放進度

4.1 服務暴露 擷取總時長的方法 擷取目前播放進度的方法

4.2 通過Handler 執行延遲消息 每隔500ms 更新一次進度條進度

4.3 handler執行的延遲消息 當音樂暫停 以及界面退出的時候 要把消息移除掉

⑤拖動進度條跟新播放的進度

5.1 服務暴露 seekTo 移動到某個位置播放的方法

5.2 給seekbar設定拖動的監聽 在onProgressChanged方法中 通過傳入的progress更新播放器的播

放進度

布局檔案:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

   <ImageButton 
       android:id="@+id/im_btn"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerHorizontal="true"
       android:background="@null"
       android:onClick="touch"
       android:src="@drawable/btn_audio_play"
       />

   <SeekBar
       android:id="@+id/sk_progress"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_alignParentRight="true"
       android:layout_below="@+id/im_btn" />

</RelativeLayout>
           

清單檔案:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima.Music"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.itheima.Music.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.itheima.Music.MusicService"></service>
    </application>

</manifest>
           

mainactivity:

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.view.View;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

import com.itheima.Music.MusicService.MyBinder;

public class MainActivity extends Activity {

    private static final int SUCCESS = 0;
	private ImageButton im_button;
	private MyConnection conn;
	private MyBinder mm;
	private SeekBar sb_progress;
	//建立一個handler對象
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case SUCCESS:
				getPosition();
				break;

			default:
				break;
			}
		};
	};

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        im_button = (ImageButton) findViewById(R.id.im_btn);
        sb_progress = (SeekBar) findViewById(R.id.sk_progress);
        sb_progress.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
			
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
                //停止觸摸				
			}
			
			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
 				//開始觸摸
			}
			
			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
                 if(fromUser){
                	 mm.seekTo(progress);
                 }				
			}
		});
        Intent service = new Intent(getApplicationContext(), MusicService.class);
		conn = new MyConnection();
        startService(service);
		bindService(service, conn, BIND_AUTO_CREATE);
    }
	public class MyConnection implements ServiceConnection{
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mm = (MyBinder) service;
			updateIcon();
			//擷取一下總的時長
			sb_progress.setMax(mm.getDuration());
			sb_progress.setProgress(mm.getPrograss());
		}
		@Override
		public void onServiceDisconnected(ComponentName name) {
		}
	}
    public void touch(View v){
    	 mm.playPause();
    	 updateIcon();
    }
	private void updateIcon() {
		if(mm.isPlaying()){
    		 im_button.setImageResource(R.drawable.btn_audio_pause);
    		 handler.sendEmptyMessage(SUCCESS);
    	 }else{
    		 im_button.setImageResource(R.drawable.btn_audio_play);
    		 handler.removeMessages(SUCCESS);
    	 }
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unbindService(conn);
	}
	public void getPosition(){
		int prograss = mm.getPrograss();
		sb_progress.setProgress(prograss);
		handler.sendEmptyMessageDelayed(SUCCESS, 500);
	}
	@Override
	protected void onStop() {
		super.onStop();
		handler.removeCallbacksAndMessages(null);
	}
	@Override
	protected void onResume() {
		super.onResume();
		if(mm!=null){
			handler.sendEmptyMessageDelayed(SUCCESS, 500);
		}
	}
}
           

服務類代碼

public IBinder onBind(Intent intent) {
  		return new MyBinder();
	}
    @Override
    public void onCreate() {
    	super.onCreate();
    	player = new MediaPlayer();
    	//播放器設定資源路徑
    	try {
			player.setDataSource(path);
			player.prepare();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    public class MyBinder extends Binder{
    	public void playPause(){
    		if(player.isPlaying()){
    			player.pause();
    		}else{
    		player.start();
    	}
    }
    	public boolean isPlaying(){
    		return player.isPlaying();
    	}
    	//擷取總的時長
    	public int getDuration(){
    		return player.getDuration();
    	}
    	//擷取進度狀态
    	public int getPrograss(){
    		return player.getCurrentPosition();
    	}
    	//定義一個方法,傳入要擷取的毫秒值
    	public void seekTo(int msec){
    		player.seekTo(msec);
    	}
    
}
}