Не могу заставить телефон воспроизводить звук и вибрировать, используя Qt для Android

Я развертываю приложение для Android, используя QtCreator.

Я хотел бы воспроизвести звук и заставить телефон вибрировать, чтобы уведомить пользователя о том, что случилось что-то плохое. Я использую QAndroidJniObject для вызова функций SDK.

Я не мог заставить кого-либо работать.

Для «вибрации»:

// java code:
// import android.os.Vibrator;
// Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE);
// v.vibrate(500);
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
if ( activity.isValid() )
{
QAndroidJniObject serviceName = QAndroidJniObject::getStaticObjectField<jstring>("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", "(I)V", 1000);
}
}
}

vibrator.callMethod достигается (благодаря Майкл, помоги), но телефон не вибрирует (обратите внимание, что мое приложение имеет android.permission.VIBRATE)

Для «воспроизведения звука» я попробовал оба варианта:

// java code:
// Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
// Ringtone ring = RingtoneManager.getRingtone(getApplicationContext(), notification);
// ring.play();
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
if ( activity.isValid() )
{
jint notifcationType = QAndroidJniObject::getStaticField<jint>("android/media/RingtoneManager", "TYPE_NOTIFICATION");
{
QAndroidJniObject notification = QAndroidJniObject::callStaticObjectMethod("android/media/RingtoneManager", "getDefaultUri", "(I)Landroid/net/Uri;", notifcationType);
if ( notification.isValid() )
{
QAndroidJniObject ring = QAndroidJniObject::callStaticObjectMethod("android/media/RingtoneManager", "getRingtone", "(Landroid.content.Context;Landroid/net/Uri;)Landroid.media.Ringtone;",activity.object<jobject>(),notification.object<jobject>());
if ( ring.isValid() )
{
ring.callMethod<void>("play", "()V");
}
}
}
}

а также

QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
if ( activity.isValid() )
{
jint notifcationType = QAndroidJniObject::getStaticField<jint>("android/media/RingtoneManager", "TYPE_NOTIFICATION");

QAndroidJniObject notification = QAndroidJniObject::callStaticObjectMethod("android/media/RingtoneManager", "getDefaultUri", "(I)Landroid/net/Uri;", notifcationType);
if ( notification.isValid() )
{
QAndroidJniObject player = QAndroidJniObject::callStaticObjectMethod("android/media/MediaPlayer", "create", "(Landroid.content.Context;Landroid/net/Uri;)Landroid.media.MediaPlayer;",activity.object<jobject>(),notification.object<jobject>());

if ( player.isValid() )
{
player.callMethod<void>("start", "()V");
}
}
}

В обоих случаях последняя функция не достигается, потому что объекты недействительны (ни игрок, ни кольцо не действительны).

2

Решение

  1. Вибрация () занимает много времени в качестве аргумента, а не int.
  2. Всегда используйте косую черту для разделения имен пакетов и классов в ваших вызовах jni.

пытаться:

QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
//    QAndroidJniObject activity = QtAndroid::androidActivity(); // Req. Qt 5.3
if ( activity.isValid() )
{
// This gets the string value of the VIBRATOR_SERVICE field.
QAndroidJniObject serviceField = QAndroidJniObject::getStaticObjectField<jstring>("android/content/Context", "VIBRATOR_SERVICE");
if ( serviceField.isValid() )
{
QAndroidJniObject vibrator = activity.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",serviceField.object<jobject>());
if ( vibrator.isValid() )
{
// Note that vibrate takes a long and not an int as argument.
vibrator.callMethod<void>("vibrate", "(J)V", 500);
}
}
}

а также

QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
if ( activity.isValid() )
{
jint notifcationType = QAndroidJniObject::getStaticField<jint>("android/media/RingtoneManager", "TYPE_NOTIFICATION");
QAndroidJniObject notification = QAndroidJniObject::callStaticObjectMethod("android/media/RingtoneManager", "getDefaultUri", "(I)Landroid/net/Uri;", notifcationType);
if ( notification.isValid() )
{
// Note that package and class names needs to be separated with '/' and not '.'
QAndroidJniObject ring = QAndroidJniObject::callStaticObjectMethod("android/media/RingtoneManager",
"getRingtone",
"(Landroid/content/Context;Landroid/net/Uri;)Landroid/media/Ringtone;",
activity.object<jobject>(),
notification.object<jobject>());
if ( ring.isValid() )
{
ring.callMethod<void>("play", "()V");
}
}
}
2

Другие решения


По вопросам рекламы [email protected]