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

时间:2014-11-17 23:28:55

标签: java android uri

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

总之。

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

我使用MediaPlayer课程来处理大部分难题,但我对如何访问保存在用户移动设备上的音频感到有些困惑。

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

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

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

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

谢谢大家。

3 个答案:

答案 0 :(得分: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());
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

    请确保您的设备上有一首好歌作为第一首歌,以便您在完成所有艰苦工作后听一些好听的音乐: - )

    btw。:如果您想了解有关Android的ContentProvider和ContentResolver概念的更多信息,可以查看本教程: http://www.grokkingandroid.com/android-tutorial-content-provider-basics/