【Media數據庫】LocalFaraway簡易安卓音樂播放器

1.建立音樂Bean類

private var id: String? = null //歌曲id
    private var song: String? = null //歌曲名稱
    private var singer: String? = null //歌手名稱
    private var album: String? = null //專輯名稱
    private var duration: String? = null //歌曲時長
    private var path: String? = null //歌曲路徑

    private var albumUri: Uri ? = null ;//存儲音樂封面的Uri地址
    private var thumb:Bitmap? = null ;//存儲封面圖片

2.權限配置

  1. 先在清單文件中加入<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>.安卓4.4後寫需要權限
  2. 6.0 後的動態權限申請,傳送門先不寫,這個文章自己還沒寫好

3.Layout設計

  1. Relativelayout,上面有個RecycleView
  2. 下面有個信息欄RelativeLayout
    在這裏插入圖片描述

4. 獲取本地數據

  1. 使用了內容提供器,ContentProvider共享數據的好處是統一了數據訪問方式
  2. Cursor用法
//4.獲取本地數據
    fun loadLocalMusicDate(){
        //加載本地存儲中的音樂文件到mp3中
        //1,使用ContentResolver對象   獲取contentprider 實現跨進程通信
        var resolver: ContentResolver =contentResolver//get方法 應該是有簡寫
        //2.獲取本地音樂存儲的Url地址  選擇音樂Audio類
        var uri:Uri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
        //uri=content://media/external/audio/media 這是音頻媒體表的uri
        /* MediaStore.Audio.Artists.Albums
         打印它的所有的列:發現了album_art,它緩存專輯封面。所以現在我們知道需要找album_art*/
        //3.開始查詢 新建cursor對象
        val cursor: Cursor? = resolver.query(uri, null, null, null, null)
        //4.遍歷地址
        var id:Long=0
        while(cursor!!.moveToNext()){
            var song=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))//獲取字段
            var singer=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))//獲取字段
            var album=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM))//獲取字段
            id++
            val sid = id.toString()//將其轉爲string類型 計數keyid字段 掃描ID
            //添加   獲取該音樂所在專輯的id 真實ID
            //所有專輯都有自己的ID 所以肯定不會空
            var albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ID));
            //得到播放路徑
            var path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))
            //long型時間長度  代表毫秒數
            var duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION))

            var sdf = SimpleDateFormat("mm:ss")//轉一下格式 java.txt包
            var time = sdf.format(Date(duration))
            //albumart文件夾專門用於存放專輯圖片
            //組合找到當前前專輯所在Uri content://media/external/audio/albumart/4
            var albumUri:Uri ?=null
            print("查找前uri    "+albumUri+"   albumID"+albumId    )
            //I/System.out: 查找前uri    null   albumID81 發現這和id是不太一樣的
            /*
            * id78  letter song 專輯79
            * id=89   起風了  專輯87
            * id=100  告白氣球 專輯87*/
            albumUri= ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), albumId)
            println("查找後uri"+albumUri)
            var thumb:Bitmap?=null//有些專輯沒圖片
            if (albumUri!=null)//找不到對應圖片地址的bean傳空值 在adapter設定若爲空則 顯示默認的
            {
                thumb=createThumbFromUir(resolver,albumUri)
            }else{
                var res = getResources();
                var bmp = BitmapFactory.decodeResource(res, R.drawable.icon_song);
                thumb=bmp
            }

            //將同一行中的數據封裝入對象
            val bean = LocalMusicBean(sid, song, singer, album, time, path,albumUri,thumb)
            mDatas?.add(bean)//MutableList纔有add方法
            println("獲取數據成功:" + bean.toString())
        }
        cursor.close();
        //數據源變化 ,提示適配器更新 //將測試數據去掉
        adapterT?.notifyDataSetChanged();
    }
  1. 拿到專輯圖片路徑後,轉爲BMP
//創建封面圖片方法
    fun createThumbFromUir(res: ContentResolver, albumUri: Uri): Bitmap ?{
        var inF: InputStream? = null
        var bmp: Bitmap? = null
        try {
            inF = res.openInputStream(albumUri)
            val sBitmapOptions = BitmapFactory.Options()
            bmp = BitmapFactory.decodeStream(inF, null, sBitmapOptions)//流用stream直接圖片用decodeResource
            inF!!.close()
        } catch (e: FileNotFoundException) {

        } catch (e: IOException) {
            e.printStackTrace()
        }

        return bmp
    }
  1. 其他的和Faraway,不贅述了,下次寫新的播放器再完善github
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章