Странное поведение URI java/setDataSource/MediaPlayer

Я использую URI, который я передаю MediaPlayer на Android, как это:

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 ответ

Оказывается, для 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();
            }
Другие вопросы по тегам