Android MediaPlayer:Android Q 及更高版本中的文件访问

Android MediaPlayer: File Access in Android Q and above

我正在编写一个我想迁移到 Android 的媒体播放器应用程序。 我使用 MediaStore 查询音频文件并将艺术家、专辑、路径等存储在我的 SQLight 数据库中。 如果我想播放音频文件,我从数据库中获取路径(SQL 查询)并将其设置为 mediaplayer.setDatasource(路径)。尝试这样做,我收到打开失败:EACCES(权限被拒绝)错误消息。

用户可以使用文件选择器select存储音频文件的目录。

 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
 intent.addCategory(Intent.CATEGORY_DEFAULT);
 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |  Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
 startActivityForResult(Intent.createChooser(intent, "Choose directory"), PICK_AUDIO_REQUEST);

onActivityResult 中,我将 selected 目录的权限设置为

     Uri uri = data.getData();
     int takeFlags = data.getFlags();
     takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION |
     Intent.FLAG_GRANT_WRITE_URI_PERMISSION |Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);

当我尝试在媒体播放器中使用路径时 mMediaPlayer.setDataSource(path);

我收到以下错误:

 open failed: EACCES (Permission denied)

使用 android:requestLegacyExternalStorage="true" 不是我想要实施的解决方案。

manifest.xml我设置权限:

   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

请帮忙。

谢谢,GGK

您需要添加

android:requestLegacyExternalStorage="true"

in androidManifest 文件,有助于从 Q.

访问文件

使用

解决
childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(mUri,
            DocumentsContract.getTreeDocumentId(mUri));
cur = getContentResolver().query(childrenUri, null, null, null, null);

感谢@CommonsWare 对我的支持