我正在使用我传递给Android上的MediaPlayer的URI,如下所示:
mediaPlayer.setDataSource(context, Uri.parse(<uri>));
当我使用Intent.createChooser获取它时,它会播放一次然后尝试再次播放它会导致java.io.IOException:setDataSource failed:status = 0x80000000。
当我直接将URI作为字符串传递时,会导致java.io.IOException:setDataSource failed:status = 0x80000000,尽管选择器输出的URI总是相同的。
uri看起来像这样:“content://com.android.providers.media.documents/document/audio%3A21739”。
有人可以指导为什么会这样吗?
答案 0 :(得分:2)
原来android需要一些奇怪的权限shenanigans,解决方案是使用不同的开放加上使用某种权限要求,以某种方式输出相同的uri,但具有持久访问:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(intent, "Select file to add"), ADD_2);
在onActivityResult中:
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
final int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
getContentResolver().takePersistableUriPermission(uri, takeFlags);
Log.d(TAG, "Added track uri: " + uri);
playlist.add(uri.toString());
adapter.notifyDataSetChanged();
}