void AndroidCameraPrivate::setFocusAreas(const QList<QRect> &areas) { if (QtAndroidPrivate::androidSdkVersion() < 14) return; QMutexLocker parametersLocker(&m_parametersMutex); if (!m_parameters.isValid()) return; QJNIObjectPrivate list; if (!areas.isEmpty()) { QJNIEnvironmentPrivate env; QJNIObjectPrivate arrayList("java/util/ArrayList", "(I)V", areas.size()); for (int i = 0; i < areas.size(); ++i) { arrayList.callMethod<jboolean>("add", "(Ljava/lang/Object;)Z", rectToArea(areas.at(i)).object()); exceptionCheckAndClear(env); } list = arrayList; } m_parameters.callMethod<void>("setFocusAreas", "(Ljava/util/List;)V", list.object()); applyParameters(); }
QList<QRect> AndroidCameraPrivate::getFocusAreas() { QList<QRect> areas; if (QtAndroidPrivate::androidSdkVersion() < 14) return areas; QMutexLocker parametersLocker(&m_parametersMutex); if (m_parameters.isValid()) { QJNIObjectPrivate list = m_parameters.callObjectMethod("getFocusAreas", "()Ljava/util/List;"); if (list.isValid()) { int count = list.callMethod<jint>("size"); for (int i = 0; i < count; ++i) { QJNIObjectPrivate area = list.callObjectMethod("get", "(I)Ljava/lang/Object;", i); areas.append(areaToRect(area.object())); } } } return areas; }
/* * Locations where applications can place persistent files it owns. * E.g., /storage/org.app/Music */ static QString getExternalFilesDir(const char *directoryField = 0) { QString &path = (*androidDirCache)[QString(QLatin1String("APPNAME_%1")).arg(QLatin1String(directoryField))]; if (!path.isEmpty()) return path; QJNIObjectPrivate activity = QtAndroidPrivate::activity(); if (!activity.isValid()) return QString(); QJNIObjectPrivate appCtx = applicationContext(); if (!appCtx.isValid()) return QString(); QJNIObjectPrivate dirField = QJNIObjectPrivate::fromString(QLatin1String("")); if (directoryField) { dirField = QJNIObjectPrivate::getStaticObjectField("android/os/Environment", directoryField, "Ljava/lang/String;"); if (!dirField.isValid()) return QString(); } QJNIObjectPrivate file = appCtx.callObjectMethod("getExternalFilesDir", "(Ljava/lang/String;)Ljava/io/File;", dirField.object()); if (!file.isValid()) return QString(); return (path = getAbsolutePath(file)); }
int AndroidConnectivityManager::stopUsingNetworkFeature(int networkType, const QString &feature) { QJNIObjectPrivate jfeature = QJNIObjectPrivate::fromString(feature); return m_connectivityManager.callMethod<jint>("stopUsingNetworkFeature", "(ILjava/lang/String;)I", networkType, jfeature.object()); }
void AndroidCameraPrivate::fetchLastPreviewFrame() { QJNIEnvironmentPrivate env; QJNIObjectPrivate data = m_cameraListener.callObjectMethod("lockAndFetchPreviewBuffer", "()[B"); if (!data.isValid()) { m_cameraListener.callMethod<void>("unlockPreviewBuffer"); return; } const int arrayLength = env->GetArrayLength(static_cast<jbyteArray>(data.object())); QByteArray bytes(arrayLength, Qt::Uninitialized); env->GetByteArrayRegion(static_cast<jbyteArray>(data.object()), 0, arrayLength, reinterpret_cast<jbyte *>(bytes.data())); m_cameraListener.callMethod<void>("unlockPreviewBuffer"); emit previewFetched(bytes); }
QList<QByteArray> QAndroidTimeZonePrivate::availableTimeZoneIds() const { QList<QByteArray> availableTimeZoneIdList; QJNIObjectPrivate androidAvailableIdList = QJNIObjectPrivate::callStaticObjectMethod("java.util.TimeZone", "getAvailableIDs", "()[Ljava/lang/String;"); QJNIEnvironmentPrivate jniEnv; int androidTZcount = jniEnv->GetArrayLength( static_cast<jarray>(androidAvailableIdList.object()) ); // need separate jobject and QAndroidJniObject here so that we can delete (DeleteLocalRef) the reference to the jobject // (or else the JNI reference table fills after 512 entries from GetObjectArrayElement) jobject androidTZobject; QJNIObjectPrivate androidTZ; for (int i=0; i<androidTZcount; i++ ) { androidTZobject = jniEnv->GetObjectArrayElement( static_cast<jobjectArray>( androidAvailableIdList.object() ), i ); androidTZ = androidTZobject; availableTimeZoneIdList.append( androidTZ.toString().toUtf8() ); jniEnv->DeleteLocalRef(androidTZobject); } return availableTimeZoneIdList; }
QList<AndroidNetworkInfo> AndroidConnectivityManager::getAllNetworkInfo() const { QJNIEnvironmentPrivate env; QJNIObjectPrivate objArray = m_connectivityManager.callObjectMethod("getAllNetworkInfo", "()[Landroid/net/NetworkInfo;"); QList<AndroidNetworkInfo> list; if (!objArray.isValid()) return list; const jsize length = env->GetArrayLength(static_cast<jarray>(objArray.object())); if (exceptionCheckAndClear(env)) return list; for (int i = 0; i != length; ++i) { jobject lref = env->GetObjectArrayElement(static_cast<jobjectArray>(objArray.object()), i); if (exceptionCheckAndClear(env)) break; list << AndroidNetworkInfo(lref); env->DeleteLocalRef(lref); } return list; }
void AndroidCameraPrivate::startPreview() { //We need to clear preview buffers queue here, but there is no method to do it //Though just resetting preview callback do the trick m_camera.callMethod<void>("setPreviewCallbackWithBuffer", "(Landroid/hardware/Camera$PreviewCallback;)V", jobject(0)); m_cameraListener.callMethod<void>("preparePreviewBuffer", "(Landroid/hardware/Camera;)V", m_camera.object()); QJNIObjectPrivate buffer = m_cameraListener.callObjectMethod<jbyteArray>("callbackBuffer"); m_camera.callMethod<void>("addCallbackBuffer", "([B)V", buffer.object()); m_camera.callMethod<void>("setPreviewCallbackWithBuffer", "(Landroid/hardware/Camera$PreviewCallback;)V", m_cameraListener.object()); m_camera.callMethod<void>("startPreview"); emit previewStarted(); }
/* * Locations where applications can place user files (public). * E.g., /storage/Music */ static QString getExternalStoragePublicDirectory(const char *directoryField) { QString &path = (*androidDirCache)[QLatin1String(directoryField)]; if (!path.isEmpty()) return path; QJNIObjectPrivate dirField = QJNIObjectPrivate::getStaticObjectField("android/os/Environment", directoryField, "Ljava/lang/String;"); if (!dirField.isValid()) return QString(); QJNIObjectPrivate file = QJNIObjectPrivate::callStaticObjectMethod("android/os/Environment", "getExternalStoragePublicDirectory", "(Ljava/lang/String;)Ljava/io/File;", dirField.object()); if (!file.isValid()) return QString(); return (path = getAbsolutePath(file)); }
void AndroidMediaRecorder::setCamera(AndroidCamera *camera) { QJNIObjectPrivate cam = camera->getCameraObject(); m_mediaRecorder.callMethod<void>("setCamera", "(Landroid/hardware/Camera;)V", cam.object()); }
QString QAndroidTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType, const QLocale &locale) const { QString name; if (androidTimeZone.isValid()) { jboolean daylightTime = (timeType == QTimeZone::DaylightTime); // treat QTimeZone::GenericTime as QTimeZone::StandardTime // treat all NameTypes as java TimeZone style LONG (value 1), except of course QTimeZone::ShortName which is style SHORT (value 0); jint style = (nameType == QTimeZone::ShortName ? 0 : 1); QJNIObjectPrivate jlanguage = QJNIObjectPrivate::fromString(QLocale::languageToString(locale.language())); QJNIObjectPrivate jcountry = QJNIObjectPrivate::fromString(QLocale::countryToString(locale.country())); QJNIObjectPrivate jvariant = QJNIObjectPrivate::fromString(QLocale::scriptToString(locale.script())); QJNIObjectPrivate jlocale("java.util.Locale", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", static_cast<jstring>(jlanguage.object()), static_cast<jstring>(jcountry.object()), static_cast<jstring>(jvariant.object())); QJNIObjectPrivate jname = androidTimeZone.callObjectMethod("getDisplayName", "(ZILjava/util/Locale;)Ljava/lang/String;", daylightTime, style, jlocale.object()); name = jname.toString(); } return name; }