- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 android MediaStore。我可以获得设备上的音乐列表,以及与每个媒体项目相关的所有详细信息(标题、艺术家、持续时间等)
我希望能够显示专辑列表,以及他们的专辑艺术家。
需要明确的是,每首轨道都有一位艺术家,例如“NoFX”,但如果该轨道出现在合辑 CD 上,例如 Punk-O-Rama,则艺术家是“NoFX”,但专辑艺术家可能类似于“各种艺术家。”
我在这里复习了这个问题:
Android - Getting Album Artist from Cursor
我正在尝试使用 MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI 和 MediaStore.Audio.Albums.ARTIST 来实现。然而,这似乎没有返回正确的结果。
查看 Android 源代码,我可以看到实际上 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 后面有一个 album_artist 字段,但它被标记为“@hide”。(参见 https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/provider/MediaStore.java 处的 ~1170 行)。
我在查看其他 [相关] Android 源代码时发现了这个字段: https://android.googlesource.com/platform/development/+/master/apps/Development/src/com/android/development/MediaScannerActivity.java
我编写了一个简单的应用程序/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<String> albumArtistNames = new SparseArray<String>();
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);
}
}
此 Activity 产生以下 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 的 Huawei Prism II 上测试并看到了相同的行为
为什么获取专辑艺术家的直接而不是“隐藏”的方法不起作用?
我期望专辑查询也返回“Various Artists”。
感谢所有帮助。
最佳答案
我没有看到您在代码中的任何地方定义或导入 ListActivity。
看看这两个例子:
关于android - 为什么 MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI 不提供准确的 "Album Artist"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20710542/
我正在尝试使用 Android 的 MediaStore 类并尝试创建一个非常简单的照片库应用程序,这时我注意到有两个图像内容 URI:EXTERNAL_CONTENT_URI 和 INTERNAL_
我正在关注this tutorial创建一个音乐播放器但遇到了障碍。 我可以很好地加载应用程序。但是,尽管手机 SD 卡上的“音乐”文件夹中存在音乐文件,但该列表中并未填充任何音乐文件。 Conten
我有兴趣对特定流派的所有专辑执行查询。 Android 可以使用 MediaStore.Audio.Artists.Albums.getContentUri 轻松地对特定艺术家的专辑执行类似查询,但就
我正在为所有音乐文件查询 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI。它工作得很好,但每当我想从我的 sdCard 中删除音乐文件时,列表不会更新。知道如何
为什么 Android 可能会在卸载/安装 SD 卡操作后删除保存在 Media.EXTERNAL_CONTENT_URI 下的数据?如何避免这种情况? 我使用此 URI 和上下文中的默认内容解析器保
我编写了从 MediaStore.Video.Media.EXTERNAL_CONTENT_URI 中获取视频的代码和 INTERNAL_CONTENT_URI使用 context.getConten
我想通过 contentResolver 插入音乐来获取 uri。 val contentValues = ContentValues() contentValues.put(MediaStore.A
我已按如下方式添加到我的 AndroidManifest.xml 中,但每次单击该按钮时都会出现 SecurityException。
我正在开发一个 Android 应用程序,我必须在其中检测 Android SD 卡中音频文件的变化,包括文件名、文件路径和对其执行的操作。例如,如果我要在我的 SD 卡中添加一个文件,那么我想知道
我正在使用 android MediaStore。我可以获得设备上的音乐列表,以及与每个媒体项目相关的所有详细信息(标题、艺术家、持续时间等) 我希望能够显示专辑列表,以及他们的专辑艺术家。 需要明确
首先感谢您的帮助。 我认为对于不熟悉查询内容提供程序的人来说,这应该是一个相当微不足道的问题。 我需要查询 MediaStore.Images.Media 以获取设备上的所有图像,包括内部存储和 SD
我正在获取设备中所有图像、视频和音频文件的列表。以下代码在 android O (api 27) 之前的所有设备上都可以正常工作。但它不适用于 android Pie 设备(api 28)。 Curs
我是一名优秀的程序员,十分优秀!