我需要确定媒体播放器是否正在使用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();

10-08 12:32