改進音樂播放器

前幾天看數據庫時發現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)處理其他按鍵事件。

就說這麼多了,這個音樂播放器還得繼續改進啊。。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章