Android编程 – 使URI获得audio位置

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

无论如何。

我试图创build一个简单的类来处理我devise的自定义音乐播放器的audio。 我已经处理了所有按键事件,所以现在我正在处理function。

我使用MediaPlayer类来处理大部分困难的事情,但是我对如何访问保存在用户移动设备上的audio有些困惑。

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

如果有人可以张贴一些如何使用Uri代码示例来访问这个,那么我相当肯定,我将能够build立在此之上,然后将数据添加到任何我想要的容器中。

只是为了说清楚 – 用户不知道音乐位置目录,并且我没有创build原始文件夹,我想要访问软件可以播放的用户设备上的所有音乐。

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

谢谢大家。

Solutions Collecting From Web of "Android编程 – 使URI获得audio位置"

以下是如何使用Uri访问audio文件的示例,此代码在用户设备上search歌曲并将详细信息存储在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()); } } 

您可能会使用提供的MediaStore并查询所有find的audio。 它是系统附带的ContentProvider ,您可以使用自己的ContentResolver访问它。 看看MediaStore.Audio.Media ,看看那里的Uri条目。 另请参阅此页面 ,“从ContentResolver中获取媒体”,了解一些简单的示例代码。

首先,您应该考虑是否真的想通过文件系统直接播放audio文件。 更常见的工作方式是通过查询内置媒体数据库来访问媒体文件,而不是直接使用文件系统。 如果你想使用媒体数据库,你通常是这样做的:

  1. 获取内容parsing器的实例(通常通过在您的活动中调用getContentResolver()来完成)
  2. 然后您可以向ContentResolver请求某种types的可用媒体。 在这里你首次与URI联系。 通过为查询指定一个特定的URI,告诉ContentResolver哪种介质是你所介入的。 由于您对Music感兴趣,因此您可以查询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)参数,您可以指定过滤条件,sorting条件等。

您的查询为您提供了一个Cursor的实例。 用你的光标实例你基本上可以做两件事情。

  • 您可以遍历查询的结果
  • 你可以询问你的结果的列结构(例如,名字列TITLE的索引,艺术家名字ARTIST和最后但不是最less的ID列)。

所以我们假设你只对第一首歌曲的ID感兴趣。 你可以通过调用Cursor来完成它:

 cursor.moveToFirst(); 

您现在可以简单地调用光标的types化getter来访问您感兴趣的列,例如,您可以调用这首歌的ID:

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

如果你想知道你会做的专辑名称:

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

显然,为了简洁起见我省略了所有的error handling(在现实世界中,您应该检查设备上是否有歌曲,查询是否成功,…)。

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

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

这给你的媒体文件的URI,然后你可以给mediaplayer开始回放你的文件:

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

作为设备上的第一首歌,一定要有一首好歌,以便在经过艰苦的努力之后,听一些优秀的音乐:-)

顺便说一句:如果你想了解更多关于Android的ContentProvider和ContentResolver概念,你可以看看这个教程: http : //www.grokkingandroid.com/android-tutorial-content-provider-basics/