Android實現本地音樂播放(一、實現音頻的讀取)

前期問題

起初是爲了實現一個簡易的音樂播放,但是在網上看到帖子後普遍使用getContentResolver().query()的方法來獲取數據庫中的音頻數據。
數據庫的地址是 com.android.providers.media
這裏作爲萌新,看到有幾點不是很清楚:
1、com.android.providers.media數據庫存放的是什麼?
2、我想調用的音樂文件應該放在哪?
3、音頻文件和數據庫是怎麼關聯的?

關於Content Providers的解釋(根據網上解釋以及自己的理解)

Android通過Content Providers將公共數據類型(音頻、視頻、圖像、聯繫人信息等)整合到數據庫中,儲存地址和基本信息。

文件存放位置

我試着在文件目錄中存放/storage/sdcard0中存放數據,我隨便選取了幾首MP3

這裏寫圖片描述

當我打開模擬器的文件管理器,然後看見mp3在文件主目錄中,沒有存到任何一個子文件夾,我重啓模擬器,然後導出com.android.providers.media下的external.db,並沒有看到自己想看到的數據,於是我將模擬器的mp3轉存到子文件夾中,然後重啓模擬器,並重新導出目標external.db,可以看到自己存放的資源已經被搜索並更新到數據庫中截圖如下:
這裏寫圖片描述

小結

  • 可能是模擬器的緣故,需要重啓才能更新external.db,同時沒能更新在首目錄中的資源,但是放在子文件中的資源都能夠搜索到並添加到external.db中。也就是當我們往手機上放圖片或者音樂的時候,會在該database中存放圖片或者音樂的信息,而我們的應用程序是能夠通過ContentResolver去讀取到這些數據的。

利用ContentResolver.query()讀取數據

根據Android文檔,該方法的參數如下

1. 從數據庫中獲取數據(以下代碼以從sd卡中讀取mp3數據爲例)

public final Cursor query (Uri uri,                 //Url,即查詢路徑
                String[] projection,   //查詢時希望獲得的列,如果填null,則返回所有列
                String selection,      //查詢時的條件,select語句中where用到,可填null
                String[] selectionArgs, //查詢條件屬性值
                String sortOrder,       //查詢到的數據的默認排序,null則不進行排序
                )

示例:

Cursor mCursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,   //路徑
                new String[]{MediaStore.Audio.Media._ID,    //寫入我想要獲得的信息(列)
                        MediaStore.Audio.Media.TITLE,
                        MediaStore.Audio.Media.ALBUM,
                        MediaStore.Audio.Media.DISPLAY_NAME,
                        MediaStore.Audio.Media.ARTIST,
                        MediaStore.Audio.Media.DURATION,
                        MediaStore.Audio.Media.SIZE,
                        MediaStore.Audio.Media.DATA}, null, null, null);

2. 將cursor中的數據轉存到事先定義好的List中

        List<MusicInfo> mMusicInfos = new ArrayList<>();
        for (int i = 0; i < mCursor.getCount(); ++i) {
            MusicInfo musicInfo = new MusicInfo();  //MusicInfo類是數據儲存單元
            mCursor.moveToNext();   //讀取下一行,moveToNext()有boolean返回值,執行成功返回ture,反之false,可用於判斷是否讀取完畢。

            long id = mCursor.getLong(0);
            String title = mCursor.getString(1);
            String album = mCursor.getString(2);
            String displayName = mCursor.getString(3);
            String artist = mCursor.getString(4);
            long duration = mCursor.getLong(5);
            long size = mCursor.getLong(6);
            String url = mCursor.getString(7);   //轉存數據

            musicInfo.setTitle(title);   
            musicInfo.setId(id);
            musicInfo.setAlbum(album);
            musicInfo.setArtist(artist);
            musicInfo.setSize(size);
            musicInfo.setDisplayName(displayName);
            musicInfo.setDuration(duration);
            musicInfo.setUrl(url);  //存到數據單元

            mMusicInfos.add(musicInfo);  //添加到List
        }

這就成功實現了將數據讀取並存到List中
注意

別忘了在AndroidManifest.xml中添加讀取sd卡的權限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章