首页 > 解决方案 > 在模拟器中使用反射创建 SensorEvent 对象不起作用

问题描述

我想创建一个SensorEvent对象来模拟传感器数据。所以我用这个反射代码来创建SensorEvent

private fun getSensorEventObject(size : Int) : SensorEvent?{
    val cons = SensorEvent::class.constructors.toList()
    if (cons.isNotEmpty()) {
        return cons[0].call(size)
    }
    return null
}

这在真实设备中运行良好。但是当我在模拟器中运行这段代码时,这不起作用。我得到了这个例外

kotlin.reflect.full.IllegalCallableAccessException: java.lang.IllegalAccessException: Class java.lang.Class<kotlin.reflect.jvm.internal.calls.CallerImpl$Constructor> cannot access  method void android.hardware.SensorEvent.<init>(int) of class java.lang.Class<android.hardware.SensorEvent>

不确定,因为模拟器没有真正的硬件,这就是我遇到异常的原因。

SensorEvent当应用程序在模拟器中运行时,我有什么方法可以创建对象?

标签: androidreflectionandroid-emulatorandroid-sensors

解决方案


构造函数仍被标记为包私有。这可以通过将其设置为可访问来规避:

private fun getSensorEventObject(size : Int) : SensorEvent?{
    return SensorEvent::class.constructors.firstOrNull()?.let{
        it.isAccessible = true
        it.call(size)
    }
}

推荐阅读