我需要确定媒体播放器是否正在使用opencore媒体框架,以便可以禁用对我的流的搜索。 opencore框架似乎在搜索中默默地失败了,我很难相信他们允许将其投入生产,但情况似乎仍然如此。
我希望它就像确定其SDK版本一样简单,但是具有api 8的droid手机似乎仍在使用opencore,因此这似乎不是一个好选择。有任何想法吗?
编辑:
耶稣回答后,我想到了这段代码。到目前为止,它在我的测试中似乎运行良好。如果有人认为这不是寻找流的合理方法,请告诉我
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();
}
}
}
最佳答案
该方法不适用于Samsung Galaxy S,后者表示已启用Stagefright但不使用它,至少不用于流式传输。一种更安全的检查方法是打开本地套接字,然后将MediaPlayer连接到该套接字,并查看其报告为User-Agent的内容。
例如,这就是我在三星Galaxy S和2.2模拟器上看到的;
银河S:
用户代理:CORE/6.506.4.1 OpenCORE/2.02(Linux; Android 2.2)
仿真器:
用户代理: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();
并在另一个线程中像这样(使return上面的阻塞accept()调用);
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(String.format("http://127.0.0.1:%d/", socketPort));
mp.prepare();
mp.start();