如果我知道路径,如何从MediaStore获取歌曲ID?

3

目前我正在通过歌曲标题从MediaStore获取歌曲ID:

long id = 0;
    ContentResolver cr = context.getContentResolver();

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.TITLE;
    String[] selectionArgs = {songTitle};
    String[] projection = {MediaStore.Audio.Media._ID};
    String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";

    Cursor cursor = cr.query(uri, projection, selection, selectionArgs, sortOrder);

    if (cursor != null) {
        while (cursor.moveToNext()) {
            int idIndex = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
            id = Long.parseLong(cursor.getString(idIndex));
        }
    }
    return id;

只有当标题不为空时,这个功能才能很好地工作。 是否有一种直接从mp3文件路径中获取MediaStore歌曲ID的方法?


为什么这个问题被踩了? - Florin Tenea
1个回答

4
我会回答自己的问题,因为我找到了解决方案。 解决方案是用 DATA 替换 TITLE,因为 DATA 代表媒体文件在 MediaStore 中的路径。
public static long getSongIdFromMediaStore(String songPath, Context context) {
    long id = 0;
    ContentResolver cr = context.getContentResolver();

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.DATA;
    String[] selectionArgs = {songPath};
    String[] projection = {MediaStore.Audio.Media._ID};
    String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";

    Cursor cursor = cr.query(uri, projection, selection + "=?", selectionArgs, sortOrder);


    Log.d(Constants.LOG_TAG, songPath);
    if (cursor != null) {
        while (cursor.moveToNext()) {
            int idIndex = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
            id = Long.parseLong(cursor.getString(idIndex));
        }
    }
    return id;
}

很不幸,对我来说它不起作用 - 我的文件路径类似于 - /storage/emulated/0/Music/[Songs.PK] 01 - Bang Bang - Tu Meri.mp3, 使用与上面完全相同的代码,但它不起作用。 它没有进入条件 - while (cursor.moveToNext()) {。 我无法找到原因,你能帮忙吗? - Narendra Singh
是的,感谢 String[] selectionArgs = {songPath}; 这一行代码,这就是我们如何获取特定音频文件的元数据。 - user25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接