前言:
我把之前學習寫的音樂播放器的獲取本地Audio文件的功能部分總結一下,因爲以後可能也要看;然後是求贊,有贊就很開心
正文
讀取之前需要聲明權限
一般在AndroidMenifest文件中聲明
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
表示需要外部存儲權限
但是在Android6.0 API23之後在manifest文件中聲明可能不能生效,還要明面上和用戶請求一次或者手動在手機應用程序管理中打開權限
我的權限申請的代碼如下:
public void requestPermissionByHand() {
//判斷當前系統的版本
if (Build.VERSION.SDK_INT >= 23) {
int checkWriteStoragePermission = ContextCompat.checkSelfPermission(
DisplayActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE);
//如果沒有被授予
if (checkWriteStoragePermission != PackageManager.PERMISSION_GRANTED) {
//請求權限,此處可以同時申請多個權限
ActivityCompat.requestPermissions(
DisplayActivity.this, new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE
}, REQ_READ_EXTERNAL_STORAGE);
}
}
}
DisplayActivity.this這裏需要一個Context對象,我這裏傳入的本Activity.this
請求權限後有一個回調方法如下:
@Override
public void onRequestPermissionsResult(int requestCode, final String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQ_READ_EXTERNAL_STORAGE:
// 如果請求被取消了,那麼結果數組就是空的
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 權限被授予了
if (song_total_number == 0)
load_Songs_data();//加載歌曲數據
} else {
Toast.makeText(DisplayActivity.this, "申請權限失敗", Toast.LENGTH_SHORT).show();
}
break;
}
}
權限的問題解決後在開始獲取本地音樂
我只用到了 歌名,歌手,時長,專輯ID,文件路徑這幾個屬性
其餘還有很多屬性,官方文檔介紹如下:
https://developer.android.google.cn/reference/android/provider/MediaStore.Audio.Media?hl=zh_cn
獲取本地音樂代碼如下
private static List<Song> songsList = new ArrayList<>();//用於裝歌曲數據
ContentResolver contentResolver = getContentResolver();
Cursor cursor = null;
try {
cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
//是否是音頻
int isMusic = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));
//時長
long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
//是音樂並且時長大於3分鐘
if (isMusic != 0 && duration >= 3 * 60 * 1000) {
//歌名
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
//歌手
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
//專輯id
long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
//文件路徑
String dataPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
//歌名,歌手,時長,專輯,圖標,文件路徑,sequence number of list in listview
Song song = new Song(
title,
artist,
duration,
albumId,
R.drawable.song_item_picture,//這是一個UI圖片,爲了方便在這裏加入了
dataPath,
song_total_number);
songsList.add(song);//加入了列表
song_total_number++;//計數器加一
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null)
cursor.close();//用完要關閉
}
獲取音樂文件中自帶的專輯圖片,
不知道什麼原因,我這裏嘗試的時候有些歌曲的專輯圖片可以獲取,但是有些卻不成功
傳入的參數是Song類對象的參數dataPath 我把Song類寫成了Java BEAN形式,用getDataPath方法就可以獲取該屬性
參數120的單位是我的像素爲40*40的圖片返回的bimap對象的寬高,好像與下面的話有關:
Android手機的屏幕分ldpi、mdpi、hdpi,甚至還有xhdpi,對於mdpi(density=160)設備,1dp=1px,對於hdpi(density=240)的設備,1dp=1.5px
設置的代碼如下
image_music.setImageBitmap(getAlbumPicture(songsList.get(current_music_list_number).getDataPath()));
獲取專輯圖片代碼如下
/**********獲取歌曲專輯圖片*************/
public Bitmap getAlbumPicture(String dataPath) {
android.media.MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(dataPath);
byte[] data = mmr.getEmbeddedPicture();
Bitmap albumPicture = null;
if (data != null) {
//獲取bitmap對象
albumPicture = BitmapFactory.decodeByteArray(data, 0, data.length);
//獲取寬高
int width = albumPicture.getWidth();
int height = albumPicture.getHeight();
//Log.w("DisplayActivity","width = "+width+" height = "+height);
// 創建操作圖片用的Matrix對象
Matrix matrix = new Matrix();
// 計算縮放比例
float sx = ((float) 120 / width);
float sy = ((float) 120 / height);
// 設置縮放比例
matrix.postScale(sx, sy);
// 建立新的bitmap,其內容是對原bitmap的縮放後的圖
albumPicture = Bitmap.createBitmap(albumPicture, 0, 0, width, height, matrix, false);
return albumPicture;
} else {
albumPicture = BitmapFactory.decodeResource(getResources(), R.drawable.music1);
//music1是從歌曲文件讀取不出來專輯圖片時用來代替的默認專輯圖片
int width = albumPicture.getWidth();
int height = albumPicture.getHeight();
//Log.w("DisplayActivity","width = "+width+" height = "+height);
// 創建操作圖片用的Matrix對象
Matrix matrix = new Matrix();
// 計算縮放比例
float sx = ((float) 120 / width);
float sy = ((float) 120 / height);
// 設置縮放比例
matrix.postScale(sx, sy);
// 建立新的bitmap,其內容是對原bitmap的縮放後的圖
albumPicture = Bitmap.createBitmap(albumPicture, 0, 0, width, height, matrix, false);
return albumPicture;
}
}
希望能幫助到屏幕面前的你,點個贊再走!!!