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 对我的支持
我正在编写一个我想迁移到 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 对我的支持