如何从 Qt Android 使手机振动
Posted
技术标签:
【中文标题】如何从 Qt Android 使手机振动【英文标题】:How to make phone vibrate from Qt Android 【发布时间】:2015-04-15 07:38:26 【问题描述】:我正在使用 Qt 部署 android 应用。
我想让手机振动。所以我尝试使用QAndroidJniObject
执行this code。
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】:根据我从the documentation 收集到的信息,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
的本地引用。
【讨论】:
感谢您的回复,我无法使用 Qt 5.2.1 编译这段代码。错误是undefined reference to '_jstring* QAndroidJniObject::getStaticField<_jstring*>(char const*, char const*)
糟糕。那应该是getStaticObjectField
而不是getStaticField
。
顺便说一句,手机不振动 :-( 即使现在到达并执行了振动代码。有什么想法吗?
振动呼叫配置文件必须从 (I)V
更改为 (J)V
。编辑了原始帖子。以上是关于如何从 Qt Android 使手机振动的主要内容,如果未能解决你的问题,请参考以下文章