Как включить заголовки http с помощью MediaPlayer setDataSource? - PullRequest
16 голосов
/ 22 января 2012

Я передаю URI методу setDataSource объекта MediaPlayer. Я нацеливаюсь на версию API менее 14, поэтому считаю, что я не могу использовать новый метод, который позволяет включать заголовки. Как включить заголовки (в частности, заголовок аутентификации) в запрос MediaPlayer и при этом поддерживать старые устройства Android?

Мой код выглядит так:

 mediaPlayer.setDataSource(url);
 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
 mediaPlayer.prepareAsync();

1 Ответ

17 голосов
/ 14 августа 2012

Фон:

Метод setDataSource (Контекстный контекст, Uri uri, Картазаголовки) был включен в SDK (помечен как @hide) довольно долгое время (по крайней мере, начиная с Froyo 2.2.x, API Level 8), посмотрите историю изменений:

Расширение API: поддержка для необязательного указания карты дополнительных заголовков запроса при указании URI мультимедийных данных, которые должны быть воспроизведены

И не было скрыто и открыто для публики со времен Ice Cream Sandwich 4.0.x, APIУровень 14:

Отображение метода setDataSource MediaPlayer, который принимает необязательные заголовки http для передачи на сервер

Обходной путь:

до Ice Cream Sandwich 4.0.x, API уровня 14, мы можем использовать рефлексию, вызывая этот API скрытия:

Uri uri = Uri.parse(path);
Map<String, String> headers = new HashMap<String, String>();
headers.put("key1", "value1");
headers.put("key2", "value2");

mMediaPlayer = new MediaPlayer();
// Use java reflection call the hide API:
Method method = mMediaPlayer.getClass().getMethod("setDataSource", new Class[] { Context.class, Uri.class, Map.class });
method.invoke(mMediaPlayer, new Object[] {this, uri, headers});
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.prepareAsync();

... ...
...