diff options
author | Val Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-03-07 12:53:45 +0100 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-03-25 08:42:06 +0000 |
commit | 1057d6a89ab4c19825ab2d5d12aed31496b89423 (patch) | |
tree | bf45508e49297398d75eeb7966cf2a608c723e68 | |
parent | 95b7fc4950c1f0d895896cf3086c69126d45e061 (diff) |
Android: Introduce HTTP headers to MediaPlayer
Added using the headers from QNetworkRequest to be sent together with the request
for the data in MediaPlayer::setDataSource.
The MediaPlayer requires also a Context object, together with headers,
to resolve the Uri. It will try to find a content provider.
Since no content providers are implemented, this produces a warning:
"MediaPlayer: Couldn't open file on client side; trying server side: java.io.FileNotFoundException: No content provider"
Task-number: QTBUG-74073
Change-Id: I1566953b523e84400882ba9d3a968cec6b4a61cf
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
4 files changed, 29 insertions, 5 deletions
diff --git a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java index 6569a7b8d..5a0462338 100644 --- a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java +++ b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java @@ -41,6 +41,7 @@ package org.qtproject.qt5.android.multimedia; import java.io.IOException; import java.lang.String; +import java.util.HashMap; import java.io.FileInputStream; // API is level is < 9 unless marked otherwise. @@ -67,6 +68,7 @@ public class QtAndroidMediaPlayer private MediaPlayer mMediaPlayer = null; private AudioAttributes mAudioAttributes = null; + private HashMap<String, String> mHeaders = null; private Uri mUri = null; private final long mID; private final Context mContext; @@ -344,6 +346,16 @@ public class QtAndroidMediaPlayer } } + public void initHeaders() + { + mHeaders = new HashMap<String, String>(); + } + + public void setHeader(final String header, final String value) + { + mHeaders.put(header, value); + } + public void setDataSource(final String path) { if ((mState & State.Uninitialized) != 0) @@ -381,7 +393,10 @@ public class QtAndroidMediaPlayer FileDescriptor fd = fis.getFD(); mMediaPlayer.setDataSource(fd); } else { - mMediaPlayer.setDataSource(path); + if (mHeaders.isEmpty()) + mMediaPlayer.setDataSource(path); + else + mMediaPlayer.setDataSource(mContext, mUri, mHeaders); } setState(State.Initialized); } catch (final IOException e) { diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp index 4bfcce5bc..13a8cdbbb 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp @@ -384,7 +384,7 @@ void QAndroidMediaPlayerControl::setMedia(const QMediaContent &mediaContent, if ((mMediaPlayer->display() == 0) && mVideoOutput) mMediaPlayer->setDisplay(mVideoOutput->surfaceTexture()); - mMediaPlayer->setDataSource(mediaContent.canonicalUrl().toString(QUrl::FullyEncoded)); + mMediaPlayer->setDataSource(mediaContent.canonicalRequest()); mMediaPlayer->prepareAsync(); } diff --git a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp index 79685e16f..f899481f0 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp +++ b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp @@ -166,9 +166,17 @@ void AndroidMediaPlayer::setMuted(bool mute) mMediaPlayer.callMethod<void>("mute", "(Z)V", jboolean(mute)); } -void AndroidMediaPlayer::setDataSource(const QString &path) +void AndroidMediaPlayer::setDataSource(const QNetworkRequest &request) { - QJNIObjectPrivate string = QJNIObjectPrivate::fromString(path); + QJNIObjectPrivate string = QJNIObjectPrivate::fromString(request.url().toString(QUrl::FullyEncoded)); + + mMediaPlayer.callMethod<void>("initHeaders", "()V"); + for (auto &header : request.rawHeaderList()) { + auto value = request.rawHeader(header); + mMediaPlayer.callMethod<void>("setHeader", "(Ljava/lang/String;Ljava/lang/String;)V", + QJNIObjectPrivate::fromString(header).object(), QJNIObjectPrivate::fromString(value).object()); + } + mMediaPlayer.callMethod<void>("setDataSource", "(Ljava/lang/String;)V", string.object()); } diff --git a/src/plugins/android/src/wrappers/jni/androidmediaplayer.h b/src/plugins/android/src/wrappers/jni/androidmediaplayer.h index 14cbf49bc..37c7456f7 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediaplayer.h +++ b/src/plugins/android/src/wrappers/jni/androidmediaplayer.h @@ -41,6 +41,7 @@ #define ANDROIDMEDIAPLAYER_H #include <QObject> +#include <QNetworkRequest> #include <QtCore/private/qjni_p.h> #include <QAudio> @@ -112,7 +113,7 @@ public: void stop(); void seekTo(qint32 msec); void setMuted(bool mute); - void setDataSource(const QString &path); + void setDataSource(const QNetworkRequest &request); void prepareAsync(); void setVolume(int volume); bool setPlaybackRate(qreal rate); |