2011-01-02 14 views
9

Muszę określić, czy mediaplayer korzysta ze środowiska opencore, tak, że mogę wyłączyć wyszukiwanie moich strumieni. Wydaje się, że ramy opencore nie działają po cichu w poszukiwaniu, co sprawia mi trudność, sądząc, że dopuszczają do produkcji, ale tak się jednak wydaje.Określić strukturę opencore lub stagefright dla mediaplayer?

Żałuję, że nie było tak proste, jak określenie wersji SDK, ale telefony z Droidem, które mają api 8, wydają się nadal używać opencore, więc nie wydaje się to dobrym rozwiązaniem. Jakieś pomysły?

EDIT:

Po odpowiedzi od Jezusa, wpadłem na pomysł z tym kodem. Wydaje się, że w moich testach jak dotąd dobrze się to sprawdza. Jeśli ktoś uważa, że ​​nie jest to metoda poszukiwania strumieni dźwięku, daj mi znać

if (Build.VERSION.SDK_INT < 8) //2.1 or earlier, opencore only, no stream seeking 
     mStreamSeekable = false; 
    else { // 2.2, check to see if stagefright enabled 
     mStreamSeekable = false; 
     try { 
       FileInputStream buildIs = new FileInputStream(new File("/system/build.prop")); 
       if (CloudUtils.inputStreamToString(buildIs).contains("media.stagefright.enable-player=true")) 
        mStreamSeekable = true; 
      } catch (IOException e) { //problem finding build file 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

Witam, Jak uzyskać klasę CloudUtils? –

+0

@AlexTran To powinno pomóc http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string –

+0

Naprawdę przykro mi, nie rozumiem co masz na myśli z linku . –

Odpowiedz

6

Ta metoda nie działa na Samsung Galaxy S, która mówi, że Stagefright jest włączony, ale go nie używa, przynajmniej nie do przesyłania strumieniowego. Bardziej bezpiecznym sprawdzeniem jest otwarcie lokalnego gniazda i podłączenie MediaPlayer do niego i zobaczenie, co raportuje jako User-Agent.

Na przykład, to jest to, co widzę na moim Samsung Galaxy S i 2.2 Emulator;

Galaxy P. User-Agent: rdzeń/6.506.4.1 OpenCORE/2,02 (Linux, Android 2.2)

wiązki: User-Agent: stagefright/1.0 (Linux; Android 2.2)

W jednym wątku, zrób coś takiego;

volatile int socketPort; 

    ServerSocket serverSocket = new ServerSocket(0); 
    socketPort = serverSocket.getLocalPort(); 

    Socket socket = serverSocket.accept(); 

    InputStream is = socket.getInputStream(); 

    byte [] temp = new byte [2048];  
    int bsize = -1; 
    while(bsize <= 0) { 
     bsize = is.read(temp); 
    } 
    String res = new String(temp, 0, bsize); 

    if(res.indexOf("User-Agent: stagefright") >= 0) { 
     // Found stagefright 
    } 

    socket.close(); 
    serverSocket.close(); 

I podoba mi się to w innym wątku (powoduje, że połączenie blokujące accept() powyżej zwraca);

MediaPlayer mp = new MediaPlayer(); 
    mp.setDataSource(String.format("http://127.0.0.1:%d/", socketPort)); 
    mp.prepare(); 
    mp.start(); 
+1

Czy możesz pokazać kod dla tego? –

+1

to nie działa dla wszystkich telefonów, na przykład telefony htc mają ** User-Agent: HTC Streaming Player [kod operatora]/1.0/htc_pyramid/2.3.3 **, który nie ma ** stagefright **. – Samuel

1

Aby uzyskać tę informację można odczytać pliku /system/build.prop urządzenia. W tym pliku znajduje się parametr o nazwie media.stagefright.enable-player. Jeśli ten parametr jest ustawiony na true, wówczas stagefright jest aktywny, w przeciwnym razie urządzenie używa opencore.

+0

Wygląda obiecująco, ale Log.i (TAG, "Stagefright Enabled:" + System.getProperty ("media.stagefright.enable-player")); // zwraca null na każdym urządzeniu, które testuję. –

+0

To prawda, przepraszam. Następnie musisz otworzyć plik build.prop i odczytać parametr. –

1

może być w stanie wykryć, czy stagefright jest włączona dla streamingu wyszukując

media.stagefright.enable-http=true 

zamiast

media.stagefright.enable-player=true 
2

Z Androida 2.3.5, obecnie media.stagefright. Właściwość enable-player nie istnieje w /system/build.prop

Powiązane problemy