如何让手机从Qt Android振动

How to make phone vibrate from Qt Android

本文关键字:Qt Android 振动 手机      更新时间:2023-10-16

我正在使用Qt部署Android应用程序。

我想让手机振动。所以我尝试使用 QAndroidJniObject 执行此代码。

爪哇代码:

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()返回假的,我不知道为什么......这不是我第一次尝试做这种事情,但在这里,我无法让它工作。

注意:我的应用已设置android.permission.VIBRATE

从我从文档中收集到的信息来看,QAndroidJniObject::fromString返回一个对象,该对象使用您提供给fromString的内容包装 Java 字符串。

所以你现在正在做的就好像你在 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的本地引用。