2011-01-02 3 views
9

Мне нужно определить, использует ли медиаплеер среду носителей opencore, поэтому я могу отключить поиск моих потоков. Рамка opencore, похоже, терпит неудачу в поисках, о которой я с трудом верю, что они допущены к производству, но это, тем не менее, имеет место.Определить рамки opencore или stagefright для медиапланера?

Мне жаль, что это не было так просто, как определить их версию SDK, но телефоны-дроиды, у которых есть api 8, похоже, все еще используют opencore, поэтому, похоже, не очень хороший вариант. Есть идеи?

EDIT:

После ответа от Иисуса, я пришел с этим кодом. Кажется, это хорошо работает в моих тестах. Если кто-то не думают, что это надежный метод для поиска потоков, дайте мне знать,

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

Привет, Как обладать классом CloudUtils? –

+0

@AlexTran Это должно помочь http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string –

+0

Действительно извините, я не понимаю, что вы можете сказать о том, что я найду по ссылке , –

ответ

6

Этот метод не работает на Samsung Galaxy S, который говорит, что Stagefright включен, но не использует его, по крайней мере, для потоковой передачи. Более безопасная проверка заключается в том, чтобы открыть локальный сокет и подключить MediaPlayer к нему и посмотреть, что он сообщает в качестве User-Agent.

Например, это то, что я вижу на своей Samsung Galaxy S и 2.2 Emulator;

Galaxy S: User-Agent: ОСНОВНОЙ/6.506.4.1 OpenCore/2.02 (Linux, Android 2.2)

Эмулятор: User-Agent: stagefright/1.0 (Linux; Android 2.2)

В одной теме сделайте что-нибудь подобное;

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(); 

И как это в другом потоке (делает вызов блокировки accept() выше возврата);

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

Не могли бы вы показать код для этого? –

+1

это не работает для всех телефонов, например, телефоны htc имеют ** User-Agent: HTC Streaming Player [код оператора]/1.0/htc_pyramid/2.3.3 **, который не имеет ** stagefright **, упомянутого. – Samuel

1

Чтобы получить эту информацию вы можете прочитать файл /system/build.prop вашего устройства. В этом файле есть параметр с именем media.stagefright.enable-player. Если для этого параметра установлено значение true, то активен stagefright, в противном случае ваше устройство использует opencore.

+0

Выглядит многообещающе, но Log.i (TAG, «Stagefright Enabled:» + System.getProperty («media.stagefright.enable-player»)); // возвращает null на любое устройство, которое я тестирую –

+0

Это правда, извините. Затем вам нужно открыть файл build.prop и прочитать параметр. –

1

Вы могли бы быть в состоянии обнаружить, если stagefright включен для потоковой передачи с помощью функции поиска для

media.stagefright.enable-http=true 

вместо

media.stagefright.enable-player=true 
2

с Android 2.3.5, теперь media.stagefright. свойство enable-player не существует в /system/build.prop

Смежные вопросы