【问题标题】:Android Studio - Trying to Read MP3 FIles from the Music Directory on Android DeviceAndroid Studio - 尝试从 Android 设备上的音乐目录中读取 MP3 文件
【发布时间】:2020-08-29 19:28:10
【问题描述】:

我有一个功能,我从这里的帖子中获得,我正在尝试从设备中读取音乐文件。

   public List<AudioModel> getAllAudioFromDevice(final Context context) {
        final List<AudioModel> tempAudioList = new ArrayList<>();
        Cursor c = getAllTracks(this);


        if (c != null) {
            Log.d("Count :", String.valueOf(c.getCount()));
            while (c.moveToNext()) {
                AudioModel audioModel = new AudioModel();
                String path = c.getString(0);
                String name = c.getString(1);
                String album = c.getString(4);

                audioModel.setaAlbum(album);
                audioModel.setaArtist(artist);
       
                Log.e("Name :" + name, " Album :" + album);
                Log.e("Path :" + path, " Artist :" + artist);

                tempAudioList.add(audioModel);
            }
            c.close();
        } else {
            Log.d("Name :", "No Music");
        }

        return tempAudioList;
    }

    public Cursor getAllTracks(Context context) {
        // gets all tracks
        if (context != null) {
            ContentResolver cr = context.getContentResolver();
            final String[] columns = {track_id, track_no, artist, track_name,
                    album, duration, path, year, composer};
            return cr.query(uri, columns, null, null, null);
        } else {
            return null;
        }
    }

当我运行该应用程序时,它不会列出任何 MP3 文件,但会选择 oog 文件。我上传到模拟器的mp3文件如下:

我也尝试过 EXTERNAL_CONTENT_URI,但没有显示出来。

这是 Theo 建议的“播放列表管理器”应用程序:

抱歉,我对 Android Studio 很陌生,可能遗漏了一些非常明显的东西。有人可以帮忙吗?

【问题讨论】:

  • 我还在清单文件中添加了
  • 看起来不错,尝试重新启动 avd,因为这将确保重新扫描媒体。如果您只是上传它们,那么设备可能不知道新媒体
  • 嗨 Theo,我已经尝试过了,但仍然无法接收到它们。在模拟器上,我可以看到存储中的音乐文件,因此看起来设备正在检测它们。
  • 也查询 BUCKET_NAME。
  • 将一些文件直接放在音乐目录中。

标签: java android-studio mediastore


【解决方案1】:

你的问题是

Uri uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;

改成

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

并删除 .DATA 位 光标 c = context.getContentResolver().query(uri, projection, MediaStore.Audio.Media.DATA, null, null) 当您将标准放在那里时。查找查询的语法。将其设置为null,它将起作用

【讨论】:

  • 不幸的是,这也不起作用。从那以后,我对代码进行了很多更改,并将使用我现在所拥有的内容对其进行更新,这些内容基本上来自其他人关于此主题的博客。
  • 我已使用我在另一篇博文中尝试过的不同功能进行了编辑。它与我最初发布的内容不同,但它也不起作用。 “音乐计数”日志始终为 0,无论是 INTERNAL 还是 EXTERNAL。
  • 如果您的音乐计数 = 0,则数据库中没有 .mp3 文件。你试过我的播放列表管理器的建议了吗?如果您在媒体数据库中有曲目,那肯定会告诉您。我的代码在过去的 5 年里运行良好,所以如果你坚持下去,它会运行的
  • 嗨西奥,感谢您的回复。我修改了我的代码以反映您的答案并编辑了帖子以显示它现在的样子。我很抱歉,因为我对 Android 开发非常非常陌生。我不确定您所说的“播放列表管理器”是什么意思。不好意思,是我对Android开发的了解不够,空余时间才做了一个月。如果可以的话,可以举个例子解释一下吗?
  • 播放列表管理器是我在 google play 上的应用。它是免费的,所以下载它看看它会产生什么
【解决方案2】:

这是我的做法,注意语法

return cr.query(uri, columns, null, null, null)

你有

  Cursor c = context.getContentResolver().query(uri, projection, MediaStore.Audio.Media.DATA, null, null);



 private final String track_id = MediaStore.Audio.Media._ID;
    private final String track_no = MediaStore.Audio.Media.TRACK;
    private final String track_name = MediaStore.Audio.Media.TITLE;
    private final String artist = MediaStore.Audio.Media.ARTIST;
    private final String artist_id = MediaStore.Audio.Media.ARTIST_ID;
    private final String duration = MediaStore.Audio.Media.DURATION;
    private final String album = MediaStore.Audio.Media.ALBUM;
    private final String composer = MediaStore.Audio.Media.COMPOSER;
    private final String year = MediaStore.Audio.Media.YEAR;
    private final String path = MediaStore.Audio.Media.DATA;
    private final String date_added = MediaStore.Audio.Media.DATE_ADDED;
    private final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;


        public Cursor getAllTracks(Context context) {
        // gets all tracks
        if (context != null) {
            ContentResolver cr = context.getContentResolver();
            final String[] columns = {track_id, track_no, artist, track_name,
                    album, duration, path, year, composer};
            return cr.query(uri, columns, null, null, null);
        } else {
            return null;
        }
    }

【讨论】:

  • 嗨 Theo,非常感谢,我会试一试,让你知道它是否有效。希望明天我能做到,我会及时通知您。
  • 嗨 Theo,我已经更改了我的代码以包含您的建议,但它仍然是一样的。我已经更新了我的问题,以反映根据您的建议所做的更改。记录时的计数值仍然是“显示 2020-09-04 07:24:39.559 15448-15448/com.example.musicbox D/Count :: 0”。我不确定我是否正确实施了您的建议。我是 Java 和 Android Studio 的新手,所以我可能无法正确回答您的问题。
  • 您没有检索到正确的列。路径不是位置 0,名称不是位置 1。使用 colmnindex 而不是硬编码
  • 我会尝试,但是由于计数值为 0,这是否意味着它甚至没有找到任何可以检索列的内容?
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
相关资源
最近更新 更多