前言:
我把之前学习写的音乐播放器的获取本地Audio文件的功能部分总结一下,因为以后可能也要看;然后是求赞,有赞就很开心
正文
读取之前需要声明权限
一般在AndroidMenifest文件中声明
表示需要外部存储权限
但是在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;
}
}
希望能帮助到屏幕面前的你,点个赞再走!!!