Название говорит об этом.
Мое приложение воспроизводит рингтоны, на которые указывает uri, например content://media/internal/audio/media/387
или content://media/external/audio/media/1655
(для пользовательских мелодий на SDcard, которые, как я полагаю), используя как setDataSource(fileInfo)
, так и setDataSource(mContext, Uri.parse(fileInfo))
.
В каждом случае я получал журналы с информацией об исключении setDataSource failed.: status=0x80000000
на телефонах с использованием Android 4.x(разные версии).
Увидев, что ошибка происходит только с рингтонами, указанными в содержании uri, но не с одиночными файлами, указанными в пути, я решил использовать также пути для мелодий звонка, которые исправляли проблему на вышеуказанных телефонах (при использовании setDataSource(mContext, Uri.parse(fileInfo))
)
Однако у него возникли проблемы с телефонами с Android 2.3.4-2.3.6 (не на моем 2.3.3):
- Я получил несколько журналов с исключением:
setDataSource failed.: status=0x80000000
для файлов с такими путями, как/system/media/audio/ringtones/TwirlAway.ogg
-
Я также получил журнал о вызове метода
MediaPlayer.onErrorListener.onError(int what, int extra)
сwhat=1
иextra=-2147483648
, который, как я знаю, предлагает либо этот файл отсутствует, либо он поврежден. Однако я выполняюFile file = new File(fileInfo); if (!file.exists())
проверить в такой ситуации, и он вернул, что файл существует - он поврежден? Очень маловероятно для музыкального файла во внутренней памяти.
Подводя итог:
- работает с
setDataSource("content://media/internal/audio/media/52")
- исключает исключение:
setDataSource failed.: status=0x80000000
дляsetDataSource(mContext, "/system/media/audio/ringtones/TwirlAway.ogg")
Интересно, что первые несколько строк метода setDataSource(Context context, Uri uri, Headers headers)
, который вызывается setDataSource(Context context, Uri uri)
, являются (из источника GrepCode для 2.3.4):
String scheme = uri.getScheme();
if(scheme == null || scheme.equals("file")) {
setDataSource(uri.getPath());
return;
}
Итак, в конце концов, он просто терпит неудачу для setDataSource("/system/media/audio/ringtones/TwirlAway.ogg")
. Я взял пути к рингтонам из uris, используя:
private static String getRingtonePathFromContentUri(Context context,
Uri contentUri) {
String[] proj = { MediaStore.Audio.Media.DATA };
Cursor ringtoneCursor = context.getContentResolver().query(contentUri,
proj, null, null, null);
ringtoneCursor.moveToFirst();
return ringtoneCursor.getString(ringtoneCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
}
Любые идеи, которые могут вызывать забрасывание ошибок? Возможно, это некоторые проблемы, вызванные отсутствием прав на чтение? Я думаю, исходный код для встроенной функции setDataSource (String path) очень помог бы, но я не смог его найти.