2010-05-28 13 views
14

Widziałem sporo postów z tym pytaniem na SO, ale nie wydaje się być ostateczną odpowiedź (lub przynajmniej odpowiedź lubię!)Jak strumieniowo uwierzytelniony treści z MediaPlayer na Androida

Mam zabezpieczoną zawartość za podstawowym uwierzytelnieniem (nazwa użytkownika/hasło) - mogę pobrać ją dobrze za pomocą różnych typów pobierania HTTP, ale dla mojego życia nie mogę określić, jak polecić odtwarzaczowi strumieniowemu przesyłanie strumieniowe (i zapewnić uwierzytelnianie). Widziałem jeden post sugerujący, że nie było to możliwe, ponieważ MediaPlayer jest natywnym kodem i nie ma takich rzeczy jak Authenticator.

Istnieje wiele przykładów, jak najpierw pobrać do kopii w pamięci podręcznej, a następnie odtwarzać z powrotem, ale .... Tego rodzaju do bani (i pliki może 100's MB). Widziałem co najmniej jedną propozycję pobrania go w małych kawałkach, a następnie rozpocznij odtwarzanie (przekierowanie do nowego pliku), ale ten rodzaj jest również do dupy, ponieważ istnieje (jak przypuszczam) zacinanie się (nie próbowałem tego)

Najlepszym pomysłem, jaki mam w tym momencie, jest rozpoczęcie pobierania do pliku pamięci podręcznej, a następnie, gdy jest "wystarczająco dużo", rozpoczęcie odtwarzania, podczas gdy nadal wypełnia się plik ... I nadzieję, że to działa (ale znowu, nie próbowałem tego).

Czy brakuje mi czegoś oczywistego? To tak bolesne, że wszystkie te elementy prawie działają i przekonałem się, że musi istnieć sposób na natywne przesyłanie chronionych treści (lub wymaga to już ustanowionego kwalifikowanego InputStream), ale wydaje się, że nie ma w tym żadnej radości.

BTW Jestem facetem Mac/iPhone i nowicjuszem w Androidzie, więc wciąż walczę trochę z nauką Java .... Przepraszam, jeśli brakuje mi czegoś oczywistego.

+0

Z http://developer.android.com/guide/topics/media/index.html, "Uwaga: jeśli jesteś przekazując adres URL do internetowego pliku multimedialnego, plik musi mieć możliwość progresywnego pobierania. " Jeśli to nie jest to opublikuj kod. –

+2

hej @ loghound czy znalazłeś rozwiązanie? Oprócz waszych rozważań myślę o używaniu czegoś takiego jak ciasteczko do przechowywania danych uwierzytelniających, a może funkcja pobierania Androidem go złapie. – sosergio

+1

Odkryłem również, że nie można przesyłać strumieniowo HTTPS. W trakcie pracy wdrożyliśmy progresywne odtwarzanie i działa, ale jest dużo kodu. –

Odpowiedz

2

Jeśli kontrolujesz serwer, jedną z opcji może być jego modyfikacja, aby po uwierzytelnieniu była opcja generowania tymczasowego, losowego adresu URL dla treści, a następnie przesłania go strumieniowo. Czy funkcje przesyłania strumieniowego zaakceptują URL zawierający parametry skryptu?

Aby zrobić wszystko w całości przez telefon, inną opcją byłoby napisanie banalnego serwera proxy HTTP, takiego jak serwer, w kodzie java lub natywnym i uruchomienie go w wątku w tle. Zamiast wskazywać odtwarzacz multimediów na serwerze, wskażesz go na swoim własnym serwerze proxy. Serwer proxy przekazuje żądania do zdalnego serwera podczas obsługi uwierzytelniania.

1

Jednym ze sposobów jest pobranie danych osobiście, odkodowanie (od ??? do PCM) i użycie AudioTrack do odtworzenia PCM. Sztuczka polega na dekodowaniu. W jakim formacie jest zakodowany strumień?

Surowe dekodery dla typowych protokołów są dostępne w systemie Android, ale w bibliotekach C. Być może będziesz musiał dodać warstwę JNI do dekodowania, ponownie, w zależności od kodowania strumienia.

0

Miałem ten sam problem i rozwiązałem go, umieszczając poświadczenia w adresie URL. Nie jest oficjalnie obsługiwany przez HTTP, ale obsługuje go większość klientów internetowych.

Kod następuje na podstawie tego tutoriala: http://www.coderzheaven.com/2012/08/14/stream-audio-android/

try { 
     // You can use HTTPS or HTTP as protocol. 
     String myURL = "https://example.com/song.mp3"; 

     mp.reset(); 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mp.setOnPreparedListener(this); 
     mp.setOnErrorListener(this); 

     // These are the two lines, doing the magic ;) It transforms it to a url like this: https://user:[email protected]/song.mp3 
     UsernamePasswordCredentials credentials = connHelper.getCredetials(); 
     myURL = myURL.replace("://", "://" + URLEncoder.encode(credentials.getUserName(), "UTF-8") + ":" + URLEncoder.encode(credentials.getPassword(), "UTF-8") + "@"); 

     mp.setDataSource(myURL); 
     mp.prepareAsync(); 
     mp.setOnCompletionListener(this); 
    } catch (Exception e) { 
     Log.e("StreamAudioDemo", e.getMessage()); 
    } 

UWAGA: Używając URLEncoder tutaj, chcemy Un-Go problemów, takich jak: Jeśli nazwa użytkownika lub hasło zawiera dwukropek lub @.

UWAGA2: Może, ale nie musi działać, w zależności od serwera. Jeśli napotkasz ten problem, to powinieneś rzucić na niego okiem: Why do browsers not send the Authentication header when the credentials are provided in the URL?

Powiązane problemy