如何对歌曲中的专辑进行排序?

2024-04-16

所以我的问题是,当我尝试对专辑进行排序时,专辑标题和专辑艺术是错误的。

我尝试对专辑 ID 进行排序,但这并不能解决问题,因为专辑 ID 显然与对艺术进行排序无关。

当我忽略排序时,一切都是正确的,但是当我尝试对它们进行排序时,专辑名称与专辑封面不匹配。

如何对片段中的相册进行排序?

在这里你可以找到我的代码。

提前致谢,

Vince

歌曲模型

 // Columns I'll retrieve from the song table
    String[] columns = {
            SONG_ID,
            SONG_TITLE,
            SONG_ARTIST,
            SONG_ALBUM,
            SONG_ALBUMID,
            SONG_FILEPATH,
    };

    // Limits results to only show music files.
    //
    // It's a SQL "WHERE" clause - it becomes `WHERE IS_MUSIC=1`.
    //
    final String musicsOnly = MediaStore.Audio.Media.IS_MUSIC + "=1";

    // Querying the system
    cursor = resolver.query(musicUri, columns, musicsOnly, null, null);

    if (cursor != null && cursor.moveToFirst())
    {

        do {
            // Creating a song from the values on the row
            Song song = new Song(cursor.getInt(cursor.getColumnIndex(SONG_ID)),
                    cursor.getString(cursor.getColumnIndex(SONG_FILEPATH)));

            song.setTitle      (cursor.getString(cursor.getColumnIndex(SONG_TITLE)));
            song.setArtist     (cursor.getString(cursor.getColumnIndex(SONG_ARTIST)));
            song.setAlbumID    (cursor.getInt(cursor.getColumnIndexOrThrow(SONG_ALBUMID)));
            song.setAlbum      (cursor.getString(cursor.getColumnIndexOrThrow(SONG_ALBUM)));
            // Using the previously created genre and album maps
            // to fill the current song genre.
            String currentGenreID   = songIdToGenreIdMap.get(Long.toString(song.getId()));
            String currentGenreName = genreIdToGenreNameMap.get(currentGenreID);
            song.setGenre(currentGenreName);

            // Adding the song to the global list
            songs.add(song);
        }
        while (cursor.moveToNext());
    }
    else
    {
        // What do I do if I can't find any songs?

    }
    cursor.close();

public ArrayList<String> getArtists() {

    ArrayList<String> artists = new ArrayList<String>();

    for (Song song : songs) {
        String artist = song.getArtist();

        if ((artist != null) && (! artists.contains(artist)))
            artists.add(artist);
    }

    // Making them alphabetically sorted
    Collections.sort(artists, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    });
    return artists;
}

/**
 * Returns an alphabetically sorted list with all the
 * albums of the scanned songs.
 *
 * @note This method might take a while depending on how
 *       many songs you have.
 */

public ArrayList<String> getAlbums() {

    ArrayList<String> albums = new ArrayList<String>();

    for (Song song : songs) {
        String album = song.getAlbum();

        if ((album != null) && (! albums.contains(album)))
            albums.add(album);

    }

歌曲班

public class Song implements Serializable {

private long id;
private String data;
private String title = "";
private String artist = "";
private int   albumid      = -1;
private String album = "";
private String genre = "";


public Song(long songId, String songData){
    this.id = songId;
    this.data = songData;
}

public long getId(){
    return id;
}
public String getData(){return data;}

//Optional meta data

public void setTitle(String title){
    this.title = title;
}
public String getTitle() {
    return title;
}

public void setArtist(String artist){
    this.artist = artist;
}
public String getArtist() {
    return artist;
}

public int getAlbumID() {
    return albumid;
}
public void setAlbumID(int albumid) { this.albumid = albumid; }

public void  setAlbum(String album){
    this.album = album;
}
public String getAlbum() { return album; }

public void setGenre(String genre) {
    this.genre = genre;
}
public String getGenre() {
    return genre;
}


}

首先,我不确定当您按歌曲存储返回的值时为什么要尝试按专辑排序(请参阅上面的@Usman Rafi),但是..

将全局数组列表添加到片段的顶部

ArrayList<Song> Albums = new Arraylist<>();

不要尝试添加流派信息 - 您不需要它来实现您的目的

我尝试对专辑 ID 进行排序,但这并不能解决问题,因为专辑 ID 显然与对艺术进行排序无关。

专辑封面 Uri 可以写为:

ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"),
    cursor.getInt(cursor.getInt(cursor.getColumnIndexOrThrow(SONG_ALBUMID))));

所以专辑封面和album_id实际上是有着千丝万缕的联系的。

所以我的问题是,当我尝试对专辑进行排序时......

在查询的选择变量中使用 MediaStore.Audio.Media.IS_MUSIC + "=1 ) GROUP BY (" + MediaStore.Audio.Media.ALBUM ...

这将返回唯一的专辑名称(它也只会返回专辑中的一首歌曲),如果专辑在您的媒体存储数据库中重复(通过在同一专辑中包含多首歌曲),则只会添加与您的查询匹配的第一个实例到你的光标。

对相册进行排序...

使用排序顺序对相册返回的光标行进行排序;我个人使用sql的字母顺序(符号、数字、a、b、c......)对它们进行排序

您应该注意这里排序是区分大小写的,除非您指定“COLLATE NOCASE”

要编写您的查询并对其进行排序,我将使用以下代码:

String[] projection = {"DISTINCT " + MediaStore.Audio.Media.ALBUM_ID,
                         MediaStore.Audio.Media._ID, 
                         MediaStore.Audio.Media.TITLE, 
                         MediaStore.Audio.Media.ARTIST, 
                         MediaStore.Audio.Media.DATA, 
                         MediaStore.Audio.Media.ALBUM,
                         MediaStore.Audio.Media.IS_MUSIC};

String selection = MediaStore.Audio.Media.IS_MUSIC + 
                   "=1 ) GROUP BY (" + MediaStore.Audio.Media.ALBUM_ID;

String sort = MediaStore.Audio.Media.ALBUM + " COLLATE NOCASE ASC";

Cursor cursor = context.
                 getContentResolver().
                 query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
                 projection,
                 selection,
                 null,
                 sort);

之后,您可以简单地移动光标,将每一行添加到您构建的数据对象中,无需进一步排序,并且事情应该按正确的顺序排列。

我个人只是循环浏览

if(cursor != null && cursor.getCount >0){
    while(cursor.moveToNext()){
        //create new song item and add the album information you need
        Song album = new Song(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media._ID)),
           cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));             

            album.setAlbumId(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)));
            album.setAlbumId(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)));

        //add the Song item to the global arraylist
        Albums.add(album)
    }
}

cursor.close();

您现在可以按数组列表中的位置访问排序后的专辑信息...您可以使用我在顶部向您展示的 Uri 构建器来访问专辑封面...

像这样

Song Album = Albums.get(position);     
imageView.setURI(ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"),
    Album.getAlbumID());

我希望这对你有用。

我仍然认为你应该构建一个名为 Album 的数据类

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对歌曲中的专辑进行排序? 的相关文章

随机推荐

  • 日志文件未使用 java 中的 log4j 更新/创建

    我正在尝试使用 Java 中的 log4j 捕获日志 该可执行文件位于Linux环境中 它显示日志消息 但是 它没有写入日志文件 我正在使用 log4j xml 这就是我到目前为止所拥有的
  • 使用 iScroll 会阻止键盘在我的设备上显示

    我正在使用 iScroll 来提供 iPhone 风格的滚动 但是 当单击文本框时 键盘不会显示 在尝试查找可能的原因时 我发现删除iScroll脚本 使其正常工作 但在这种情况下我错过了滚动功能 这是 iScroll 中的错误吗 如果是
  • 无法使用 Visual C++ 编译 allegro

    我刚刚下载了 allegro 库 我创建一个新的空项目 然后添加一个源文件 我添加这行代码 include
  • 安装多个 npm 版本

    是否可以安装多个版本npm对于我正在从事或正在从事的不同项目npm安装总是全局的 Windows 10 还尝试安装不同版本https github com marcelklehr nodist https github com marcel
  • Maven 提供的作用域可以传递吗?

    我有一个祖先依赖项 它具有所提供的依赖范围 我需要将该范围传播到依赖于我的项目的任何内容 例如 假设我有SomeProjectA这取决于SomeLibraryB 我需要确定范围SomeLibraryB已提供 目前编译任何依赖于SomePro
  • 设计用于库存控制的“EAV”或“类/具体表继承”数据库

    我正在为一个建设项目开发库存控制系统 店员负责添加新库存并将其分发给员工 从员工处返还 这些物品 以及它们的属性 将会非常多样化 例如钢制品 服装 设备 机械 工具等 我的问题是是否要去类 具体表继承 https stackoverflow
  • 核心数据对多关系在将对象添加到父实体时创建重复项

    我是 Core Data 和 Objective c 的新手 我正在开发一个项目 从 Web 服务获取 JSON 数据并将其与核心数据同步 我成功地遵循了这个tutorial http www raywenderlich com 15916
  • 用 Java JNA 编写的关键监听器。防止多次回调

    我使用以下代码来监听全局按键事件 Win32HookManager java import com sun jna Pointer import com sun jna platform win32 Kernel32 import com
  • 使用地图计算文本文件中出现的次数

    下面的代码将计算每个字符的出现次数 如果我在文本文件中有 abc 输出将是 a 1 b 1 c 1 我在许多网站上读到 for 循环将花费大量时间 最好使用哈希映射来实现相同的效果 你们中的任何人都可以帮我如何转换这个实现哈希映射的程序吗
  • 对c#的async/await控制流程感到困惑

    我正在学习 async await 并且对 wait 的解释感到困惑MSDN https learn microsoft com en us dotnet csharp language reference keywords await w
  • SSH 连接超时

    我正在尝试使用以下命令建立 SSH 连接golang org x crypto ssh我有点惊讶我似乎不知道如何超时NewSession函数 实际上我没有看到任何超时的方法 当我尝试连接到有问题的服务器时 它会挂起很长时间 我写了一些可以使
  • 您没有浏览服务器的权限?

    我将 kcfinder 与 ckeditor 一起使用 改变的同时disabled to false在 kcfinder 的配置文件中没有问题 但是用以下命令覆盖它 SESSION KCFINDER array disabled gt fa
  • EF Core 中的 AddRange 和 AddRangeAsync 有什么区别

    我正在使用 EF Core 插入条目 我注意到当我调试这行代码时context MyEntityDbSet AddRangeAsync records 加载需要一秒钟 而不是context MyEntityDbset AddRange re
  • 列族 ID 不匹配(发现为 cebcc380-72d4-11e7-9a6b-bd620b945799;预期为 c05d6970-72d4-11e7-9a6b-bd620b945799)

    我该如何解决这个错误列族 ID 不匹配 发现为 cebcc380 72d4 11e7 9a6b bd620b945799 预期为 c05d6970 72d4 11e7 9a6b bd620b945799 Caused by java uti
  • 按多个单词的主题标签拆分术语

    我正在尝试拆分包含多个单词的主题标签的术语 例如 I am great 或 awesome dayofmylife 那么我正在寻找的输出是 I am great awesome day of my life 我所能实现的就是 gt gt g
  • 如何使用java访问SVN中的文件

    我需要你的帮助 我想使用 java 代码从 SVN 打开一个文件 任何人都可以告诉我访问文件的流程 或者任何人都可以向我发送该文件的示例代码 任何人都可以向我发送使用java通过HTML访问svn的示例代码吗 你需要看看SVNKIT Jav
  • CancellationToken 不会在 Azure Functions 中触发

    我有这个简单的 Azure 函数 public static class MyCounter public static int timerRound 0 public static bool isFirst true FunctionNa
  • 如何将我的 app.yaml 迁移到 2.7?

    我正在将我的 gae 应用程序迁移到 python 2 7 这是我的新 app yaml application webfaze version main runtime python27 api version 1 threadsafe
  • 如何修复 ReactforwardRef(Menu) Material UI?

    我创建了非常简单的自定义组件MuiMenu and MuiMenuItem 但是当我尝试显示这些组件时 我看到一个错误 如下所示 Function components cannot be given refs Attempts to ac
  • 如何对歌曲中的专辑进行排序?

    所以我的问题是 当我尝试对专辑进行排序时 专辑标题和专辑艺术是错误的 我尝试对专辑 ID 进行排序 但这并不能解决问题 因为专辑 ID 显然与对艺术进行排序无关 当我忽略排序时 一切都是正确的 但是当我尝试对它们进行排序时 专辑名称与专辑封