Android编程 – 使URI获得audio位置

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

无论如何。

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

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

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

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

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

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

谢谢大家。

  • android中的Uri Builder - '/'替换为'%2F',“:”替换为“%3A”
  • 如何在Android中获得一个图像资源的URI
  • Image uri不会在某些Android设备上的ImageView上显示图像
  • 获取Uri Android的真实路径
  • 如何使用新的Lollipop API访问所有SD卡?
  • Android Webview shouldOverrideUrlLoading方法
  • 是否有可能使用Uri.Builder,而不是“//”部分?
  • Android打开Waze和Google地图的意图
  • 以下是如何使用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/