Странное поведение 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();
}