Qt for Android(三) —— QT 中获取 Android 的Services,并调用需要Context参数的系统方法(设置音量、亮度等)

740 阅读1分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

背景

有了前两篇文章的基础,这篇文章就主要是说明一下如何获取系统 Services,并调用一些系统提供的方法。因为这些方法都需要一个 context 对象,所以我们要知道怎么获取这个 context 对象。

案例

此处以设置系统音量和获取系统音量为例:

1、androidActivity() 方法会返回应用主 Activity 的句柄,即我们需要的 context。 在这里插入图片描述

2、由于 Android 的 Services 都是定义在 Context 包下,且都是静态定义的名字,像下面这样: 在这里插入图片描述

因此如果要调用 getSystemService 方法,首先要获取到它的参数,即这个 audio 字符串,就是通过 getStaticObjectField方法获取的,这个方法的目的是获取全局静态变量,获取到全局变量后,再调用 getSystemService 方法然后传递进去,就得到了我们想要的 AUDIO_SERVICE。

OK,有了 AUDIO_SERVICE,由于返回类型是基础类型,而不是对象,因此我们直接调用callMethod 方法即可获取到音量

	QAndroidJniObject activity = androidActivity();
    QAndroidJniObject name = QAndroidJniObject::getStaticObjectField("android/content/Context","AUDIO_SERVICE","Ljava/lang/String;");
    QAndroidJniObject service = activity.callObjectMethod("getSystemService","(Ljava/lang/String;)Ljava/lang/Object;",name.object<jstring>());
    //STREAM_MUSIC ==3  FLAG_PLAY_SOUND == 4
    const int maxVolume = service.callMethod<jint>("getStreamVolume", "(I)I", 3);

当然,我们有了 AUDIO_SERVICE,也可以通过这个服务去设置音量:

service.callMethod<void>("setStreamVolume", "(III)V", 3,vol,4);

设置音量的 Android 代码原型为:

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, vol, AudioManager.FLAG_PLAY_SOUND);