我正试图在手机上获取mp3文件的图像。我已经挣扎了几天,现在我知道了;
-
首先,我使用了一个带有此代码的内容提供商
` Uri allSongsUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; String[] projection = { MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.ALBUM_KEY, MediaStore.Audio.Media.DATE_MODIFIED }; String sortOrder = MediaStore.Video.Media.DATE_MODIFIED + " DESC";
我这样创建我的光标;
Cursor cursor = ctx.getContentResolver().query(allSongsUri, projection, null, null, sortOrder);
里面有我所有的mp3文件。没关系。现在我想看看他们的封面图片。
-
如果我像这样使用MediaMetadataRetriver的getEmbeddedPicture方法
mediaMetadataRetriever.setDataSource(localeMusic.getPath()); localeMusic.setImage(mediaMetadataRetriever.getEmbeddedPicture());
大约花了6-7秒,文件将近40-50个。因为getEmbeddedPicture()太慢!。
-
我还试图获取album_id,并将另一个光标查询到MediaStore.Audio.Albums,我发现所有的相册id都是相同的,因为它们都是同一个文件夹。我不想显示他们的相册图像。我想展示文件的封面图片。我在这里试过了,但在那里,我们得到了文件相册的图像。我不是这么问的。
在哪里可以找到文件的图像路径?MetadataRetriever类在哪里可以使用getEmbeddedPicture获得它?嵌入的图片在哪里?
谢谢。向致以最良好的问候
mediaMetadataRetriever.getEmbeddedPicture()是一个本机方法,每个本机方法调用都有代价,因为JNI调用需要时间。因此,如果您重复这样的调用,您可能会损失很多时间。您可以尝试根据需要异步调用此方法并缓存结果。尝试与滑翔组合这将同时解决您的两个问题,glide调用自然是asnyc,所以您不需要实现AsyncTask类,它也会缓存您的图像。
这是基本的滑翔用法:
Glide.with(context).load(mediaMetadataRetriever.getEmbeddedPicture());
我鼓励你阅读滑翔文档。它还有很多其他功能。
希望这能有所帮助。
您可以获得这里提到的相册艺术
https://stackoverflow.com/a/17574629/3825975
基本上,
Cursor cursor = getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID+ "=?",
new String[] {String.valueOf(albumId)},
null);
if (cursor.moveToFirst()) {
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
// do whatever you need to do
}
但为了获得个人歌曲艺术,我记得就是这样做的。希望它能有所帮助。
float ht_px = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
float wt_px = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics());
Bitmap artwork, bitmap2 = null;
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
byte[] rawArt;
BitmapFactory.Options bfo = new BitmapFactory.Options();
try {
mmr.setDataSource(songUri); //songUri is the uri of the song. You need to extract this from the song id
rawArt = mmr.getEmbeddedPicture();
if (rawArt != null)
bitmap2 = BitmapFactory.decodeByteArray(rawArt, 0, rawArt.length, bfo);
if (bitmap2 == null)
bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.def_icon);
artwork = Bitmap.createScaledBitmap(bitmap2, (int) ht_px, (int) wt_px, true); //This is the bitmap you need
} catch (Exception e) {
//Exception handling
}
}