Android媒体播放器:来自HTTPS Url的流媒体音频文件

时间:2015-05-11 11:40:22

标签: android https media-player android-mediaplayer

我必须从应用程序中流式传输来自Android媒体播放器的音频文件。最初要流式传输的文件来自Http:// url,我正在使用代码 -

public void playSample() {
    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
        @Override
        protected void onPreExecute() {
            mediaPlayer = new MediaPlayer();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            try {
                try {
                    mediaPlayer.setDataSource("http://an.http.url/");
                    mediaPlayer.prepare();
                    mediaPlayer.start();
                } catch (IOException e) {
                    Log.e("AudioFileError", "Could not open file for playback.", e);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            pd.dismiss();
        }
    };
    task.execute((Void[]) null);
}

此代码根据需要使用基于http的文件,但现在音频文件的URL已更改为https:// one(即https://an.https.url/),代码失败,但

中有例外
mediaPlayer.prepare();

例外是

Prepare failed.: status=0x1

请为此建议解决方案。

2 个答案:

答案 0 :(得分:1)

android&lt; 4.x中的媒体播放器仅支持HTTP和4.x n支持BOTH http和https,因此在使用较旧API级别的https时,请考虑使用http而不是https。

答案 1 :(得分:1)

经过长时间的努力,我找到了解决方案,

  

在setDataSource()之前添加以下代码。

    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);
        MySSLSocketFactory sf = new MySSLSocketFactory(trustStore);
        sf.setHostnameVerifier(MySSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        sf.fixHttpsURLConnection();
        HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
    } catch (Exception e) {
        e.printStackTrace();
    }

<强>#UPDATE1

使用此答案的人,请阅读developer.android.com上的此警告。警告:许多网站都描述了一个糟糕的替代解决方案,即安装一个什么都不做的TrustManager。如果您这样做,您可能也不会加密您的通信,因为任何人都可以通过使用DNS技巧通过他们自己的代理发送用户的流量来伪装成您的服务器,从而在公共Wi-Fi热点上攻击您的用户< / p>