【问题标题】:Android media player: streaming audio file from HTTPS UrlAndroid 媒体播放器:从 HTTPS Url 流式传输音频文件
【发布时间】:2017-03-29 12:53:15
【问题描述】:

我必须从应用程序中流式传输来自 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

请提出解决方案。

【问题讨论】:

  • 以下 Rajan 的回答或多或少是正确的,但您可以使用本地代理作为中介来绕过该限制。有人在我的一篇帖子中提到了this project。我没有看过它,因此无法验证它的质量,但如果您搜索,还有其他示例。

标签: android https media-player android-mediaplayer


【解决方案1】:

android

【讨论】:

    【解决方案2】:

    经过长期的努力,我找到了解决办法,

    在 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 热点上的用户,通过他们自己的代理发送您的用户流量,该代理伪装成您的服务器

    【讨论】:

    • 使用此答案的人,请阅读 developer.android.com 的此警告。警告:许多网站描述了一个糟糕的替代解决方案,即安装一个什么都不做的 TrustManager。如果您这样做,您可能不会加密您的通信,因为任何人都可以通过使用 DNS 技巧来攻击您在公共 Wi-Fi 热点上的用户,通过他们自己的代理发送您的用户流量,该代理伪装成您的服务器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2021-12-22
    相关资源
    最近更新 更多