標籤:
該播放器將會直接從網路上擷取資源進行播放,並提供進度條顯示的功能
布局檔案
布局檔案中使用Seekbar組件來顯示進度條
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="開始播放" android:onClick="play"/><Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暫停播放" android:onClick="pause"/><Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="繼續播放" android:onClick="continuePlay"/><SeekBar android:id="@+id/sb" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
Activity
在Activity中需要做兩件事情,第一:從訊息佇列中擷取關於當前MP3的播放進度,通過播放進度修改SeekBar的屬性。第二:因為可以通過進度條來控制播放進度,所以擷取進度條的相關資訊來控制播放進度。
package xidian.dy.com.chujia;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.os.Message;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.SeekBar;public class MainActivity extends AppCompatActivity { IMusic music; static SeekBar sb; static Handler handler = new Handler(){ public void handleMessage(Message msg){ Bundle bundle = msg.getData(); sb.setMax(bundle.getInt("duration")); sb.setProgress(bundle.getInt("current")); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = new Intent(this, MusicService.class); startService(intent); bindService(intent, new MyConnection(), BIND_AUTO_CREATE); sb = (SeekBar) findViewById(R.id.sb); sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { music.seekTo(seekBar.getProgress()); } }); } public void play(View v){ music.play(); } public void pause(View v){ music.pause(); } public void continuePlay(View v){ music.continuePlay(); } class MyConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { music = (IMusic) service; } @Override public void onServiceDisconnected(ComponentName name) { } }}Service
在Service中需要過去當前的播放資訊,並將其寫在訊息佇列中傳遞給Activity線程。並且向外提供一個提供改變當前播放進度介面
package xidian.dy.com.chujia;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.Binder;import android.os.Bundle;import android.os.IBinder;import android.os.Message;import android.support.annotation.Nullable;import android.util.Log;import java.io.IOException;import java.util.Timer;import java.util.TimerTask;/** * Created by dy on 2016/7/29. */public class MusicService extends Service { MediaPlayer player; Timer timer; @Override public void onCreate() { player = new MediaPlayer(); timer = new Timer(); super.onCreate(); } @Nullable @Override public IBinder onBind(Intent intent) { return new MyBinder(); } public void continuePlay(){ player.start(); } public void pause(){ player.pause(); } public void play(){ player.reset(); try { player.setDataSource("http://123.206.68.138/mg.mp3"); player.prepareAsync(); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); timer.schedule(new TimerTask() { @Override public void run() { Bundle bundle = new Bundle(); bundle.putInt("duration", player.getDuration()); bundle.putInt("current", player.getCurrentPosition()); Message msg = MainActivity.handler.obtainMessage(); msg.setData(bundle); MainActivity.handler.sendMessage(msg); Log.i("duration", String.valueOf(player.getDuration())); } }, 5, 500); } }); } catch (IOException e) { e.printStackTrace(); } } @Override public void onDestroy() { super.onDestroy(); player.stop(); player.release(); timer.cancel(); } class MyBinder extends Binder implements IMusic{ @Override public void play() { MusicService.this.play(); } @Override public void pause() { MusicService.this.pause(); } public void seekTo(int msc){ player.seekTo(msc); } @Override public void continuePlay() { MusicService.this.continuePlay(); } }}介面
該介面是串連service和Activity的
package xidian.dy.com.chujia;/** * Created by dy on 2016/7/29. */public interface IMusic { void play(); void pause(); void continuePlay(); void seekTo(int msc);}資訊清單檔
在資訊清單檔中需要開啟網路許可權
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="xidian.dy.com.chujia"><uses-permission android:name="android.permission.INTERNET"/><application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="主介面"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MusicService"/></application></manifest>
android服務之MP3播放(2)