Android编程 - 制作URI以获取音频位置

问题描述 投票:7回答:3

我是Java和Android编程的新手,所以对我来说有点奇怪!我主要来自C ++ / C#的背景,所以说技术!

无论如何。

我正在尝试创建一个简单的类来处理我正在设计的自定义音乐播放器的音频。我已经处理了所有的按键事件,所以现在我正在研究这个功能。

我正在使用MediaPlayer类处理大部分硬件,但我对如何访问保存在用户移动设备上的音频感到困惑。

我一直在做一些研究,显然Android设备有一个内置的数据库,管理所有音频的位置,并访问这些数据,我必须使用Uri

如果有人可以发布一些如何使用Uri访问它的代码示例,那么我相信我将能够在此基础上构建,然后将数据添加到我想要的任何容器中。

只是为了说清楚 - 用户不知道音乐位置目录,而且我没有制作原始文件夹,我希望能够访问用户设备上保存的所有音乐,然后软件可以播放它。

或者,如果失败,一个很好的教程...我看了谷歌提供的文档,但没有任何示例代码,所以我真的不知道从哪里开始!

谢谢大家。

java android uri
3个回答
4
投票

以下是如何使用Uri访问音频文件的示例,此代码搜索用户设备上的歌曲并将详细信息存储在songsList.

ArrayList<HashMap<String, String>> songsList = new ArrayList<>();
String[] STAR = {"*"};

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
Cursor cursor = managedQuery(uri, STAR, selection, null, null);

if (cursor != null) {
    if (cursor.moveToFirst()) {
        do {
            String songName = cursor.getString(cursor.
                    getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
            String path = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Media.DATA));
            String albumName = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Media.ALBUM));
            int albumId = cursor.getInt(cursor
                    .getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

            HashMap<String, String> song = new HashMap<String, String>();
            song.put("songTitle", albumName + " " + songName + "___" + albumId);
            song.put("songPath", path);
            songsList.add(song);
        } while (cursor.moveToNext());
    }
}

2
投票

您可能会使用提供的MediaStore并查询所有找到的音频。它是系统附带的ContentProvider,您可以使用自己的ContentResolver访问它。看看MediaStore.Audio.Media,看看那里的Uri条目。另请参阅this page,“从ContentResolver中检索媒体”以获取一些简单的示例代码。


2
投票

首先,您应该考虑是否真的想通过文件系统直接播放音频文件。在android上工作的更常见方式是通过查询内置媒体数据库而不是直接使用文件系统来访问媒体文件。如果您想使用媒体数据库,通常可以通过以下方式执行此操作:

  1. 获取内容解析器的实例(通常通过在您的活动中调用getContentResolver()来完成)
  2. 然后,您可以向ContentResolver询问特定类型的可用媒体。在这里,您第一次接触到URI。您可以通过为查询指定特定的URI来告诉ContentResolver您所介入的媒体类型。由于您对音乐感兴趣,您可以查询android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI。

您现在可以像这样查询ContentResolver:

Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = contentResolver.query(uri, null, null, null, null);

这是最基本的查询,它为您提供所有已注册的媒体对象。通过指定其他(NULL)参数,您可以指定筛选条件,排序条件等。

您的查询为您提供了Cursor的实例。使用游标实例,您基本上可以做两件事。

  • 您可以遍历查询结果
  • 您可以询问结果的列结构(例如,名称列TITLE的索引,艺术家名称ARTIST以及最后但并非最不重要的ID列)。

因此,假设您只对第一首歌的ID感兴趣。您可以通过调用以下方法将Cursor设置为其开头:

cursor.moveToFirst();

您现在可以简单地调用光标的类型获取器来访问您感兴趣的列,例如,您可以调用此歌曲的ID:

long mySongId=cursor.getLong(cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID));

如果您想知道相册名称,您会这样做:

cursor.getString(android.provider.MediaStore.Audio.Media.ALBUM);

显然我省略了所有错误处理以简洁(在现实世界的例子中,你应该检查你的设备上是否有任何歌曲,查询成功,......)。

现在,因为你在mySongId中有你的歌曲ID,你可以第二次去找URI。这次您可以通过调用以下内容为您的歌曲生成完全限定的URI:

Uri mySongUri=ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mySongsId);

这将为您提供媒体文件的URI,然后您可以将其提供给媒体播放器以开始播放您的文件:

myMPlayer = new MediaPlayer();
myMPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
myMPlayer.setDataSource(getApplicationContext(), mySongUri);

一定要有一首好歌作为你设备上的第一首歌,这样你就可以在辛苦工作后听一些好听的音乐了:-)

顺便说一句:如果您想了解更多有关Android Content Provider和ContentResolver概念的信息,可以查看本教程:qazxsw poi

© www.soinside.com 2019 - 2024. All rights reserved.