android-我无法从自签名https url播放视频

android-我无法从自签名https url播放视频,android,video,https,android-videoview,Android,Video,Https,Android Videoview,我尝试从我的服务器播放视频,该服务器有自签名的https服务器,但无法工作。它仅在url为http时工作。我试图重写VideoView类的setVideoURI方法,但没有成功 错误是 MediaPlayer:setDataSource:IOException! MediaPlayer:错误(261,-1003) 我用安卓4.2在真实设备上进行了测试 当然,我可以使用相同的https url在VLC中播放视频 有什么建议吗 package com.mp.samplecode; import a

我尝试从我的服务器播放视频,该服务器有自签名的https服务器,但无法工作。它仅在url为http时工作。我试图重写VideoView类的setVideoURI方法,但没有成功

错误是 MediaPlayer:setDataSource:IOException! MediaPlayer:错误(261,-1003)

我用安卓4.2在真实设备上进行了测试
当然,我可以使用相同的https url在VLC中播放视频

有什么建议吗

package com.mp.samplecode;

import android.content.Context;
import android.net.Uri;
import android.util.AttributeSet;
import android.widget.VideoView;

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class CustomVideoView extends VideoView {

    public CustomVideoView(Context context) {
        super(context);
    }

    public CustomVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomVideoView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setVideoURI(Uri uri) {
        super.setVideoURI(uri);
        try {
            TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new java.security.cert.X509Certificate[]{};
                }

                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }

                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }
            }};

            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        } catch (Exception e) {
            if (BuildConfig.DEBUG) {
                e.printStackTrace();
            }
        }
    }
}

复制以下方法并将其粘贴到类中。在任何服务命中之前呼叫它

Kotlin开发人员应使用此选项接受自签名证书:


复制以下方法并将其粘贴到类中。在任何服务命中之前呼叫它

Kotlin开发人员应使用此选项接受自签名证书:


“我当然可以使用相同的https url在VLC中播放视频”——然后VLC有一个bug,因为它应该无法连接,因为无法验证SSL证书。关于
VideoView
,不仅您的
TrustManager
会导致您的应用被禁止进入Play Store(如果相关),而且
VideoView
不会使用
HttpsURLConnection
。在Android 7.0之前,我不知道如何通过自签名证书从Web服务器播放媒体。“我当然可以使用相同的https url在VLC中播放视频”——然后VLC有一个bug,因为它应该无法连接,因为无法验证SSL证书。关于
VideoView
,不仅您的
TrustManager
会导致您的应用被禁止进入Play Store(如果相关),而且
VideoView
不会使用
HttpsURLConnection
。在Android 7.0之前,我不知道如何通过自签名证书从Web服务器播放媒体。
private fun disableSSLCertificateChecking() {
        val hostnameVerifier = object: HostnameVerifier {
            override fun verify(s:String, sslSession: SSLSession):Boolean {
                return true
            }
        }
        val trustAllCerts = arrayOf<TrustManager>(object: X509TrustManager {
            override fun getAcceptedIssuers(): Array<X509Certificate> {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

            //val acceptedIssuers:Array<X509Certificate> = null
            @Throws(CertificateException::class)
            override fun checkClientTrusted(arg0:Array<X509Certificate>, arg1:String) {// Not implemented
            }
            @Throws(CertificateException::class)
            override fun checkServerTrusted(arg0:Array<X509Certificate>, arg1:String) {// Not implemented
            }
        })
        try
        {
            val sc = SSLContext.getInstance("TLS")
            sc.init(null, trustAllCerts, java.security.SecureRandom())
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())
            HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier)
        }
        catch (e: KeyManagementException) {
            e.printStackTrace()
        }
        catch (e: NoSuchAlgorithmException) {
            e.printStackTrace()
        }
    }
private void disableSSLCertificateChecking() {
            HostnameVerifier hostnameVerifier = new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            };

            TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                @Override
                public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {// Not implemented
                }
                @Override
                public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {// Not implemented
                }
            } };

            try {
                SSLContext sc = SSLContext.getInstance("TLS");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
                HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
            } catch (KeyManagementException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }