奇怪的URI行为java / setDataSource / MediaPlayer

时间:2016-05-04 21:20:01

标签: java android android-mediaplayer

我正在使用我传递给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”。

有人可以指导为什么会这样吗?

1 个答案:

答案 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();
            }