我在自定义VideoView上通过HTTP成功传输视频。
但是现在,我尝试通过HTTPS流式传输已签名的视频。
让我们以下面的网址为例:
这些是请求的身份验证标头,我从中构建了Map标头:
Akm-Client-Timestamp : 2014-09-27T12:18:07Z
Authorization : AKM wdMTVz5Oesgf+UVWO4CX:546gtSMWUPhP8kKPJFaBgZTzWALj/kx3PASz+Y/Za08=
ACCEPT : application/json
我已将setDataSource (Context context, Uri uri, Map<String, String> headers )
用于较新版本的Android和Java reflection
,以使用ICE_CREAM_SANDWICH
之前的标头调用隐藏的setDataSource方法。以及地图上的所有先前标题。
VideoView.java
类中的:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mMediaPlayer.setDataSource (getContext (), mUri, mHeaders);
} else {
Method method = null;
try {
method = mMediaPlayer.getClass ().getMethod ("setDataSource", new Class[] { Context.class, Uri.class, Map.class });
} catch (NoSuchMethodException e) {
Log.w (TAG, "Unable to open content: " + mUri, e);
mCurrentState = STATE_ERROR;
mTargetState = STATE_ERROR;
mErrorListener.onError (mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
return;
}
try {
method.invoke (mMediaPlayer, new Object[] {this, mUri, mHeaders});
} catch (IllegalAccessException e) {
Log.w (TAG, "Unable to open content: " + mUri, e);
mCurrentState = STATE_ERROR;
mTargetState = STATE_ERROR;
mErrorListener.onError (mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
return;
} catch (InvocationTargetException e) {
Log.w (TAG, "Unable to open content: " + mUri, e);
mCurrentState = STATE_ERROR;
mTargetState = STATE_ERROR;
mErrorListener.onError (mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
return;
}
}
并且在播放时我收到此错误:
MediaPlayer : error (1, -1004)
AwesomePlayer: mConnectingDataSource->connect () returned -1004
编辑:我想指出这不是因为视频格式,因为当我下载这个视频并将其存储到手机的外部存储器时,它可以使用我的自定义播放VideoView
有什么办法可以解决这个问题吗?
谢谢。
答案 0 :(得分:2)
您可能遇到ssl证书问题。在主要代码之前,请尝试阅读此引用以信任所有证书:Trusting all certificates using HttpClient over HTTPS,Accepting a certificate for HTTPs on Android,http://blog.denevell.org/android-trust-all-ssl-certificates.html
可能是希望你。
我使用此代码:
TrustManager[] trustAllCerts = new TrustManager[]
{ new X509TrustManager()
{
public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; }
public void checkClientTrusted( X509Certificate[] chain, String authType) {}
public void checkServerTrusted( X509Certificate[] chain, String authType) {}
}
};
try
{
SSLContext sc = SSLContext.getInstance( "SSL"); // "TLS" "SSL"
sc.init( null, trustAllCerts, null);
// sc.init( null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory( sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(
new HostnameVerifier()
{
public boolean verify( String hostname, SSLSession session) { return true; }
} );
}
catch (Exception e) {}