最近在做一個音樂播放器,用到的東西太多,先做一個小結,說一下我在這個音樂播放器中所使用到的一些東西,希望對大家有一定參考作用,具體實現下次再分塊具體說明
一.MediaPlayer
要播放音樂首先當然少不了MediaPalyer,下面介紹一下MediaPlayer的一些常用操作:
1)如何獲得MediaPlayer實例:
可以使用直接new的方式:
MediaPlayer mp = new MediaPlayer();//要調用setDataSource
也可以使用create的方式,如:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//這時就不用調用setDataSource了
2) 如何設置要播放的文件:
下面是我在Googel API裏拷的,我目前只用到了第一個中的fie-path
void | setDataSource(String path) Sets the data source (file-path or http/rtsp URL) to use.
|
void | setDataSource(FileDescriptor fd, long offset, long length) Sets the data source (FileDescriptor) to use.
|
void | setDataSource(FileDescriptor fd) Sets the data source (FileDescriptor) to use.
|
void | setDataSource(Context context,Uri uri,
Map<String, String> headers) Sets the data source as a content Uri.
|
void | setDataSource(Context context,Uri uri) Sets the data source as a content Uri.
|
a. 應用中事先自帶的resource資源
例如:MediaPlayer.create(this, R.raw.test);
根據第一個setDataSource(String path)不難看出還可以是
b. 存儲在SD卡或其他文件路徑下的媒體文件
例如:mp.setDataSource("/sdcard/Music/myohmy.mp3");
c. 網絡上的媒體文件
例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");
3)對播放器的主要控制方法:
Android通過控制播放器的狀態的方式來控制媒體文件的播放,其中:
prepare()和prepareAsync() 提供了同步和異步兩種方式設置播放器進入prepare狀態,需要注意的是,如果MediaPlayer實例是由create方法創建的,
那麼第一次啓動播放前不需要再調用prepare()了,因爲create方法裏已經調用過 了。
start()是真正啓動文件播放的方法,
pause()和stop()比較簡單,起到暫停和停止播放的作用。
4)設置播放器的監聽器:
MediaPlayer提供了一些設置不同監聽器的方法來更好地對播放器的工作狀態進行監聽,以期及時處理各種情況,
如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、
setOnErrorListener(MediaPlayer.OnErrorListener listener)等,
設置播放器時需要考慮到播放器可能出現的情況設置好監聽和處理邏輯,以保持播放器的健壯性。
下面附一張Google提供的Mediaplayer的狀態圖:
二.Service
Android中的服務,它與Activity不同,它是不能與用戶交互的(沒有界面),不能自己啓動的(需要某個Activity或者其他Context對像調用),並且是運行在後臺的程序,
在我們退出應用後,Service進程可以繼續在後臺運行而不影響其我 們使用他應用;
下面我們來看一下Service的常用操作:
1)啓動Service
Android中已經定義了一個 ‘Service’類,所有其他的Service都繼承於該類。Service類中定義了一系列的生命週期相關的方法,如: onCreate(), onStart(), onDestroy()。
在我的程序裏,我主要是用startService來啓動服務,這樣在Activity中我們可以像調用Activity一樣使用Intent調用Service:
Intent serviceIntent = new Intent( this, ServiceName.class);//this爲Activity的Context,ServiceName爲繼承了Service的一個類
不過使用的是startService( serviceIntent );
當第一次啓動Service時,會調用Service中的onCreate()方法,而且無論後面調用多少次startService,onCreate()方法只會在第一次創建Service時調用一次;
由於使用startService(serviceIntent),所以在onCreate()後還會調用onStart()方法,而且每次使用startService時都會調用onStart();
下面提供一個判斷Service是否在運行的小方法:
public boolean isServiceRunning(String ServiceName)
{
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))
{
if (ServiceName.equals(service.service.getClassName()))
{
return true;
}
}
return false;
}
其中參數ServiceName形式如:"com.bill.musicplayer.MusicService";
2)停止Service
後臺操作完成後,使用stopService(serviceIntent)停止Service,無論Service被啓動了幾次,stopService都能停止Service;
最後要注意的是Service和Activity一樣也要AndroidManifest.xml中進行配置,如下:
<service
android:enabled="true"
android:name=".MusicService">
</service>
三.AppWidget
使用Service實現後臺播放音樂的功能後,爲了使用戶更方便的對音樂播放進行控制,我有給程序增加了一個AppWidget;
應用程序窗口小部件(Widget)是微小的應用程序視圖,可以被嵌入到其它應用程序中(比如桌面)並接收週期性的更新,
並且Widget可以響應一些基本的按鈕點擊事件,這就使得我們可以直接通過桌面上的Widget來控制後臺的Service,而不必再進入應用程序。
今天實在太晚了,而且Widget部分一時半會也講不完,所以就到這吧,以後再將Service和Widget專門說一下,並給出完整播放器。