Как заставить телефон вибрировать от Qt Android

Я развертываю приложение Android с помощью Qt.

Я бы хотел, чтобы телефон вибрировал. Поэтому я пытаюсь выполнить этот код с помощью QAndroidJniObject,

Java-код:

import android.os.Vibrator;
Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(500);

C++ Qt код:

QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");

if ( activity.isValid() )
{
    QAndroidJniObject serviceName = QAndroidJniObject::fromString("android.content.Context.VIBRATOR_SERVICE");
    if ( serviceName.isValid() )
    {
        QAndroidJniObject vibrator = activity.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",serviceName.object<jobject>());
        if ( vibrator.isValid() )
        {
            vibrator.callMethod<void>("vibrate", "(J)V", 1000);
        }
        // vibrator is actually not valid!
    }
}

vibrator.isValid() возвращает false, и я не могу понять, почему... Я не первый раз пытаюсь делать подобные вещи, но здесь я не могу заставить это работать.

Примечание: мое приложение имеет android.permission.VIBRATE задавать

1 ответ

Решение

Из того, что я мог почерпнуть из документации, QAndroidJniObject::fromString возвращает объект, обертывающий строку Java с содержимым, которое вы дали fromString,

Итак, что вы делаете сейчас, как если бы вы сделали следующее в Java:

Object vibrator = getSystemService("Context.VIBRATOR_SERVICE");

когда то, что вы действительно хотите, это:

Object vibrator = getSystemService(Context.VIBRATOR_SERVICE);

Так что вместо использования QAndroidJniObject::fromString вы, вероятно, должны делать что-то вроде этого:

QAndroidJniObject serviceName = 
    QAndroidJniObject::getStaticObjectField<jstring>(
        "android/content/Context",
        "VIBRATOR_SERVICE");

Возможно, вам нужно удалить локальную ссылку на serviceName после этого.

Другие вопросы по тегам