这是我参与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);