前幾天看數據庫時發現Android上一個以前沒發現的好東西,那就是媒體庫內容提供器,通過媒體庫可以獲得本地所有音頻、視頻以及圖像文件的信息。這讓我想起了之前做的音樂播放器,當時就不知道該如何獲取本地音樂,最後做了一個文件瀏覽器讓用戶自己在文件系統裏找,用起來實在太不方便了。現在才知道原來系統已經把這部分做好了,於是打算把原來的音樂播放器重新改造一下。
1. MediaStore
MediaStore這個類是Android系統提供的一個多媒體數據庫,Android中多媒體信息都可以從這裏提取。這個MediaStore包括了多媒體數據庫的所有信息,包括音頻,視頻和圖像,Android把所有的多媒體數據庫接口進行了封裝,所有的數據庫不用自己進行創建,直接調用那些封裝好的接口就可以進行數據庫的操作了。
要使用MediaStore首先得獲得內容解析器ContentResolver,每個應用程序的上下文都有一個ContentResolver實例,可以通過Activity或者Service的Context獲得:
ContentResolver contentResolver = this. getContentResolver();
獲得ContentResolver後就可以通過查詢方法獲得一個Cursor:
cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null,null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
這裏query方法第一個參數爲希望查詢的內容提供器數據的URL,我用的是外部存儲的媒體URL;第二個參數是限定要返回的列的,傳入null將返回所有列;第三個參數就是SQL中的WHERE語句,限定要返回的行的,同樣,傳入null將返回所有行;第四個參數是與第三個參數配合使用的,用來替換WHERE語句中的?;第五個參數表示返回結果的排列方式,傳入null或者DEFAULT_SORT_ORDER將不排序。
獲得Cursor後可以用 startManagingCursor(cursor);來讓活動管理Cursor的生命週期,接着就可以使用Cursor的get和move提取所需信息了,下面就是一個簡單的歌曲選擇對話框:
musicList = newAlertDialog.Builder(MusicPlayerActivity.this).setTitle("選擇歌曲").setCursor(cursor, new OnClickListener()
{
@Override
publicvoid onClick(DialogInterface dialog, int which)
{
//TODO Auto-generated method stub
cursor.moveToPosition(which);
MSintent.putExtra("MusicName",cursor.getString(1));
startService(MSintent);
}
},cursor.getColumnName(1));
1. 確認退出
現在很多程序都有退出前提示功能,因爲想在播放器退出前選擇是否後臺繼續播放,所以自己琢磨着想做一下,一開始想在Activity的生命週期裏處理,就是Activity銷燬前提示,但是發現無論是Toast還是Dialog都無法阻塞當前進程,也就是說即使顯示了提示信息,程序也無法停下來,還是照樣退出了,最終考慮還是得捕獲用戶的按鍵事件,在幫助文檔裏找了半天終於發現了Activity中的onBackPressed(),該方法默認是直接調用finish()結束當前應用,通過重寫該方法可以實現我們自己對返回按鍵的響應方式:
@Override
publicvoid onBackPressed()
{
if(isServiceRunning("com.bill.musicplayer.MusicService"))
{
exitDialog.show();
}
else
{
//再按一次退出程序
if((System.currentTimeMillis()-exitTime)> 2000)
{
Toast.makeText(getApplicationContext(),"再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
}
else
{
finish();
}
}
}
我這裏的響應方式分兩種,第一是退出前正在播放音樂,這時我會顯示一個Dialog,讓用戶選擇是否後臺播放音樂:
exitDialog= new Dialog(this);
exitDialog.setTitle(R.string.exit);
exitDialog.setContentView(R.layout.exitdialog);
//退出且後臺播放音樂
exit1Btn =(Button)exitDialog.findViewById(R.id.exit1Btn);
exit1Btn.setOnClickListener(newView.OnClickListener()
{
@Override
public voidonClick(View v)
{
// TODO Auto-generatedmethod stub
exitDialog.cancel();
finish();
}
});
//退出且停止播放音樂
exit2Btn =(Button)exitDialog.findViewById(R.id.exit2Btn);
exit2Btn.setOnClickListener(newView.OnClickListener()
{
@Override
publicvoid onClick(View v)
{
// TODO Auto-generatedmethod stub
stopService(MSintent);
exitDialog.cancel();
finish();
}
});
cancleBtn =(Button)exitDialog.findViewById(R.id.cancleBtn);
cancleBtn.setOnClickListener(newView.OnClickListener()
{
@Override
public voidonClick(View v)
{
// TODO Auto-generatedmethod stub
exitDialog.cancel();
}
});
第二種情況是退出前不再播放音樂,這是我會顯示一個Toast提示再按一次會退出程序,
用的是System.currentTimeMillis()來判斷兩次按鍵間時間間隔,如果小於兩秒這退出:
除了onBackPressed()外,我們還可以通過onKeyDown(intkeyCode, KeyEvent event)處理其他按鍵事件。
就說這麼多了,這個音樂播放器還得繼續改進啊。。。