android albums,android – 为什么MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI没有提供准确的“专辑艺术家”?...

我正在使用

android MediaStore.我可以在设备上获得音乐列表,以及与每个媒体项目相关的所有详细信息(标题,艺术家,持续时间等)

我希望能够通过他们的专辑艺术家展示专辑列表.

需要说明的是,每首曲目都有一个艺术家,如“NoFX”,但如果曲目出现在编辑CD上,如Punk-O-Rama,艺术家就是“NoFX”,但专辑艺术家可能就像“各种艺术家”. “

我在这里回顾了这个问题:

我正在尝试使用MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI和MediaStore.Audio.Albums.ARTIST来实现.但是,这似乎没有返回正确的结果.

看看Android源代码,我可以看到事实上在MediaStore.Audio.Media.EXTERNAL_CONTENT_URI后面有一个album_artist字段,但它被标记为“@hide”.

(见07-1行~1170).

我写了一个简单的app / activity来测试这个:

package com.ma.albumartisttest;

import android.app.Activity;

import android.database.Cursor;

import android.os.Bundle;

import android.provider.MediaStore;

import android.util.Log;

import android.util.SparseArray;

import android.widget.TextView;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// query all media and get the album_artist field

Cursor cursor = getContentResolver().query(

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,

new String[]{MediaStore.Audio.Media.ALBUM_ID, "album_artist"}, null, null, null);

// Store an id=>name map

SparseArray albumArtistNames = new SparseArray();

if (cursor != null) {

for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

String mediaAlbumArtist = cursor.getString(1);

if (mediaAlbumArtist != null && mediaAlbumArtist.toLowerCase().contains("various")) {

// loop through the cursor, save "album_artist"s that look like "various"

albumArtistNames.put((int) cursor.getLong(0), mediaAlbumArtist);

}

}

cursor.close();

}

String msg;

if (albumArtistNames.size() == 0) {

msg = "No 'various' artists found!";

Log.d("TESTALBUMARTIST", msg);

} else {

StringBuffer out = new StringBuffer();

for (int i = 0; i < albumArtistNames.size(); i++) {

// loop through the albums found above

int albumId = albumArtistNames.keyAt(i);

String album_artist = albumArtistNames.get(albumId);

Cursor albumCursor = getContentResolver().query(

MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,

new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ARTIST},

MediaStore.Audio.Albums._ID + "=?",

new String[]{"" + albumId}, null);

if (albumCursor != null) {

if (albumCursor.moveToFirst()) {

// print out what was found.

String artistFromAlbumsDB = albumCursor.getString(1);

Log.d("TESTALBUMARTIST", album_artist + ":" + artistFromAlbumsDB);

out.append("Album id: " + albumId).append('\n')

.append("Artist from media table: " + album_artist).append('\n')

.append("Artist from albums table: " + artistFromAlbumsDB)

.append("\n\n");

}

albumCursor.close();

}

}

msg = out.toString();

}

// show the results on-screen

TextView tv = new TextView(this);

tv.setText(msg);

setContentView(tv);

}

}

此活动生成以下logcat输出:

12-20 14:16:45.688 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists:Mike Garson

12-20 14:16:45.708 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists:Franco Corelli

12-20 14:16:45.728 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists:The Foreshadowing

12-20 14:16:45.748 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists - Polyvinyl Record Co:Volcano, I'm Still Excited!!

12-20 14:16:45.778 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists - Curve Music:GRAND:PM

12-20 14:16:45.808 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists - DiN:Ian Boddy

12-20 14:16:45.828 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists:SNFU

12-20 14:16:45.858 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists:Pulley

12-20 14:16:45.878 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists:Osker

12-20 14:16:45.908 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists:Pennywise

12-20 14:16:45.938 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists:NoFX

12-20 14:16:45.958 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists:Death By Stereo

12-20 14:16:45.978 22009-22009/com.ma.albumartisttest D/TESTALBUMARTIST﹕ Various Artists (Sillage Intemporel):Sheri Malckin

我在运行4.4.2的Nexus 7上运行它.我也在运行4.1.1的华为Prism II上测试并看到了相同的行为

为什么没有让专辑艺术家工作的直截了当而不是“隐藏”的方式?

我期望的是,专辑查询也会返回“各种艺术家”.

所有帮助表示赞赏.

Android中,如果你想通过`RecyclerView`的音乐列表获取本地音乐的专辑图片,你可以使用`ContentResolver`和`MediaStore`提供的方法来获取。`MediaStore`是一个包含了所有媒体文件信息的数据库,其中就包括了音乐文件的信息。以下是一个基本的步骤来获取音乐的专辑图片: 1. 获取`ContentResolver`对象。 2. 使用`MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI`来查询外部存储中的音乐专辑信息。 3. 使用`query`方法来查询包含专辑图片URI的列。 4. 从`Cursor`中获取对应的URI,并且根据这个URI来获取实际的图片数据。 以下是一个示例代码片段: ```java // 获取ContentResolver对象 ContentResolver contentResolver = getContentResolver(); // 查询音乐专辑信息,包括专辑图片的URI String[] projection = { MediaStore.Audio.Albums.ALBUM_ART }; Cursor cursor = contentResolver.query( MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, projection, null, null, null); if (cursor != null && cursor.moveToFirst()) { // 获取专辑图片的URI String albumArtUri = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART)); // 这里的albumArtUri是图片文件的URI,你可以使用它来获取图片数据 // 例如,可以使用BitmapFactory.decodeFile(albumArtUri)来解码图片文件 cursor.close(); } // 注意:这段代码没有处理异常和资源释放,请在实际应用中添加相应的异常处理和资源管理 ``` 请注意,这段代码应该在拥有读取外部存储权限的Android应用程序中运行。而且,由于系统对敏感权限的管理,你需要在你的应用的`AndroidManifest.xml`中添加相应的权限声明,并且根据Android版本可能需要动态请求权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值