import android.hardware.SensorEvent;
public class SensorData {
public final long timestamp;
public final int sensorType;
public final float x;
public final float y;
public final float z;
public static SensorData from(SensorEvent event) {
final float[] values = event.values;
return new SensorData(
event.timestamp,
event.sensor.getType(),
values[0],
values[1],
values[2]
);
}
public SensorData(long timestamp, int sensorType, float x, float y, float z) {
this.timestamp = timestamp;
this.sensorType = sensorType;
this.x = x;
this.y = y;
this.z = z;
}
}
interface CustomSensorEventListener : SensorEventListener {
var originalListener: SensorEventListener?
}
在onSensorChanged回调中根据需要修改传感器值。
override fun onSensorChanged(event: SensorEvent?) {
Log.d("TAG", "onSensorChanged: original value: ${event?.values?.joinToString()}")
event?.values?.forEachIndexed { index, value -> event.values[index] = value * value }
originalListener?.onSensorChanged(event)
}
然后创建SystemSensorsManager接口和实现,如下所示:
interface SystemSensorsManager {
fun getDefaultSensor(type: Int): Sensor?
fun registerListener(
systemSensorListener: SensorEventListener,
sensor: Sensor?,
sensorDelay: Int
): Boolean
fun unregisterListener(systemSensorListener: SensorEventListener, sensor: Sensor?)
}
class SystemSensorsManagerImpl(context: Context) : SystemSensorsManager {
private val sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as? SensorManager
private val customSystemSensorEventListener: CustomSensorEventListener =
CustomSensorEventListenerImpl()
override fun getDefaultSensor(type: Int): Sensor? {
return sensorManager?.getDefaultSensor(type)
}
override fun registerListener(systemSensorListener: SensorEventListener, sensor: Sensor?, sensorDelay: Int): Boolean {
customSystemSensorEventListener.originalListener = systemSensorListener
return sensorManager?.registerListener(
customSystemSensorEventListener,
sensor,
sensorDelay
) ?: false
}
override fun unregisterListener(systemSensorListener: SensorEventListener, sensor: Sensor?) {
sensorManager?.unregisterListener(
customSystemSensorEventListener, sensor)
}
}
2条答案
按热度按时间ghhaqwfi1#
我需要模拟一个陀螺仪传感器,但是找不到方法,所以我决定自己来做,如果对大家有帮助的话,我就把它放在这里,唯一的要求是:您的设备中必须有加速度传感器。如果有,您可以使用类似下面的方法模拟加速度传感器或陀螺仪:
1.创建一个
SensorData
。这将等同于android.hardware.SensorEvent
。您将从该类读取传感器事件。1.创建一个
SensorDataListener
。这将等效于android.hardware.SensorEventListener
。1.创建一个
SensorProvider
。它将等价于android.hardware.SensorManager
。你必须子类化这个类来实现你的模拟。4.1.创建您的模拟。在本例中,加速度计值将是原始加速度计值的平方根,陀螺仪值将是原始加速度计值的平方。
4.2.在
SensorProvider
中创建静态方法以获取当前提供程序。1.完成了。您可以像这样使用
SensorProvider
:svmlkihl2#
前面的答案给了我一个很好的基础,但是我想我已经找到了一个更简单的方法来达到同样的结果,而不需要替换java类,只需要修改实际的
SensorEvent
(感谢java默认的可变属性)。使用存储的
originalListener
创建CustomSensorEventListener
接口并从SensorEventListener
继承在
onSensorChanged
回调中根据需要修改传感器值。然后创建
SystemSensorsManager
接口和实现,如下所示:最后,在您感兴趣的传感器上注册侦听器并提供实际侦听器。例如,在
MainActivity
中,与前面的答案相同: