summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp')
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp133
1 files changed, 60 insertions, 73 deletions
diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp b/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp
index 3fa480acb..b581fe255 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp
+++ b/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp
@@ -1,6 +1,6 @@
-/****************************************************************************
+/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Toolkit.
@@ -39,29 +39,24 @@
#include "androidmediametadataretriever_p.h"
-#include <QtCore/private/qjnihelpers_p.h>
-#include <QtCore/private/qjni_p.h>
#include <QtCore/QUrl>
#include <qdebug.h>
+#include <QtCore/qcoreapplication.h>
QT_BEGIN_NAMESPACE
-static bool exceptionCheckAndClear(JNIEnv *env)
+static bool exceptionCheckAndClear()
{
- if (Q_UNLIKELY(env->ExceptionCheck())) {
#ifdef QT_DEBUG
- env->ExceptionDescribe();
+ return QJniEnvironment().checkAndClearExceptions(QJniEnvironment::OutputMode::Verbose);
+#else
+ return QJniEnvironment().checkAndClearExceptions();
#endif // QT_DEBUG
- env->ExceptionClear();
- return true;
- }
-
- return false;
}
AndroidMediaMetadataRetriever::AndroidMediaMetadataRetriever()
{
- m_metadataRetriever = QJNIObjectPrivate("android/media/MediaMetadataRetriever");
+ m_metadataRetriever = QJniObject("android/media/MediaMetadataRetriever");
}
AndroidMediaMetadataRetriever::~AndroidMediaMetadataRetriever()
@@ -73,7 +68,7 @@ QString AndroidMediaMetadataRetriever::extractMetadata(MetadataKey key)
{
QString value;
- QJNIObjectPrivate metadata = m_metadataRetriever.callObjectMethod("extractMetadata",
+ QJniObject metadata = m_metadataRetriever.callObjectMethod("extractMetadata",
"(I)Ljava/lang/String;",
jint(key));
if (metadata.isValid())
@@ -95,95 +90,87 @@ bool AndroidMediaMetadataRetriever::setDataSource(const QUrl &url)
if (!m_metadataRetriever.isValid())
return false;
- QJNIEnvironmentPrivate env;
-
+ QJniEnvironment env;
if (url.isLocalFile()) { // also includes qrc files (copied to a temp file by QMediaPlayer)
- QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.path());
- QJNIObjectPrivate fileInputStream("java/io/FileInputStream",
- "(Ljava/lang/String;)V",
- string.object());
+ QJniObject string = QJniObject::fromString(url.path());
+ QJniObject fileInputStream("java/io/FileInputStream",
+ "(Ljava/lang/String;)V",
+ string.object());
- if (exceptionCheckAndClear(env))
+ if (!fileInputStream.isValid())
return false;
- QJNIObjectPrivate fd = fileInputStream.callObjectMethod("getFD",
- "()Ljava/io/FileDescriptor;");
- if (exceptionCheckAndClear(env)) {
+ QJniObject fd = fileInputStream.callObjectMethod("getFD",
+ "()Ljava/io/FileDescriptor;");
+ if (!fd.isValid()) {
fileInputStream.callMethod<void>("close");
- exceptionCheckAndClear(env);
return false;
}
- m_metadataRetriever.callMethod<void>("setDataSource",
- "(Ljava/io/FileDescriptor;)V",
- fd.object());
-
- bool ok = !exceptionCheckAndClear(env);
-
+ auto methodId = env->GetMethodID(m_metadataRetriever.objectClass(), "setDataSource",
+ "(Ljava/io/FileDescriptor;)V");
+ env->CallVoidMethod(m_metadataRetriever.object(), methodId, fd.object());
+ bool ok = !exceptionCheckAndClear();
fileInputStream.callMethod<void>("close");
- exceptionCheckAndClear(env);
-
if (!ok)
return false;
} else if (url.scheme() == QLatin1String("assets")) {
- QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.path().mid(1)); // remove first '/'
- QJNIObjectPrivate activity(QtAndroidPrivate::activity());
- QJNIObjectPrivate assetManager = activity.callObjectMethod("getAssets",
- "()Landroid/content/res/AssetManager;");
- QJNIObjectPrivate assetFd = assetManager.callObjectMethod("openFd",
- "(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;",
- string.object());
- if (exceptionCheckAndClear(env))
+ QJniObject string = QJniObject::fromString(url.path().mid(1)); // remove first '/'
+ QJniObject activity(QNativeInterface::QAndroidApplication::context());
+ QJniObject assetManager = activity.callObjectMethod("getAssets",
+ "()Landroid/content/res/AssetManager;");
+ QJniObject assetFd = assetManager.callObjectMethod("openFd",
+ "(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;",
+ string.object());
+ if (!assetFd.isValid())
return false;
- QJNIObjectPrivate fd = assetFd.callObjectMethod("getFileDescriptor",
+ QJniObject fd = assetFd.callObjectMethod("getFileDescriptor",
"()Ljava/io/FileDescriptor;");
- if (exceptionCheckAndClear(env)) {
+ if (!fd.isValid()) {
assetFd.callMethod<void>("close");
- exceptionCheckAndClear(env);
return false;
}
- m_metadataRetriever.callMethod<void>("setDataSource",
- "(Ljava/io/FileDescriptor;JJ)V",
- fd.object(),
- assetFd.callMethod<jlong>("getStartOffset"),
- assetFd.callMethod<jlong>("getLength"));
-
- bool ok = !exceptionCheckAndClear(env);
-
+ auto methodId = env->GetMethodID(m_metadataRetriever.objectClass(), "setDataSource",
+ "(Ljava/io/FileDescriptor;JJ)V");
+ env->CallVoidMethod(m_metadataRetriever.object(), methodId,
+ fd.object(),
+ assetFd.callMethod<jlong>("getStartOffset"),
+ assetFd.callMethod<jlong>("getLength"));
+ bool ok = !exceptionCheckAndClear();
assetFd.callMethod<void>("close");
- exceptionCheckAndClear(env);
if (!ok)
return false;
- } else if (QtAndroidPrivate::androidSdkVersion() >= 14) {
+ } else if (QNativeInterface::QAndroidApplication::sdkVersion() >= 14) {
// On API levels >= 14, only setDataSource(String, Map<String, String>) accepts remote media
- QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.toString(QUrl::FullyEncoded));
- QJNIObjectPrivate hash("java/util/HashMap");
-
- m_metadataRetriever.callMethod<void>("setDataSource",
- "(Ljava/lang/String;Ljava/util/Map;)V",
- string.object(),
- hash.object());
- if (exceptionCheckAndClear(env))
+ QJniObject string = QJniObject::fromString(url.toString(QUrl::FullyEncoded));
+ QJniObject hash("java/util/HashMap");
+
+ auto methodId = env->GetMethodID(m_metadataRetriever.objectClass(), "setDataSource",
+ "(Ljava/lang/String;Ljava/util/Map;)V");
+ env->CallVoidMethod(m_metadataRetriever.object(), methodId,
+ string.object(), hash.object());
+ if (exceptionCheckAndClear())
return false;
} else {
// While on API levels < 14, only setDataSource(Context, Uri) is available and works for
// remote media...
- QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.toString(QUrl::FullyEncoded));
- QJNIObjectPrivate uri = m_metadataRetriever.callStaticObjectMethod("android/net/Uri",
- "parse",
- "(Ljava/lang/String;)Landroid/net/Uri;",
- string.object());
- if (exceptionCheckAndClear(env))
+ QJniObject string = QJniObject::fromString(url.toString(QUrl::FullyEncoded));
+ QJniObject uri = m_metadataRetriever.callStaticObjectMethod(
+ "android/net/Uri",
+ "parse",
+ "(Ljava/lang/String;)Landroid/net/Uri;",
+ string.object());
+ if (!uri.isValid())
return false;
- m_metadataRetriever.callMethod<void>("setDataSource",
- "(Landroid/content/Context;Landroid/net/Uri;)V",
- QtAndroidPrivate::activity(),
- uri.object());
- if (exceptionCheckAndClear(env))
+ auto methodId = env->GetMethodID(m_metadataRetriever.objectClass(), "setDataSource",
+ "(Landroid/content/Context;Landroid/net/Uri;)V");
+ env->CallVoidMethod(m_metadataRetriever.object(), methodId,
+ QNativeInterface::QAndroidApplication::context(), uri.object());
+ if (exceptionCheckAndClear())
return false;
}