android-我无法从自签名https url播放视频
我尝试从我的服务器播放视频,该服务器有自签名的https服务器,但无法工作。它仅在url为http时工作。我试图重写VideoView类的setVideoURI方法,但没有成功 错误是 MediaPlayer:setDataSource:IOException! MediaPlayer:错误(261,-1003) 我用安卓4.2在真实设备上进行了测试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在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();
}
}