gpt4 book ai didi

Android 传感器 - 获取接近传感器值时出现问题以及使用不同手机时出现问题

转载 作者:行者123 更新时间:2023-11-30 04:45:24 29 4
gpt4 key购买 nike

过去做过一些 Android 开发,但已经有一段时间了 - 想构建一个使用方向和接近传感器的应用程序。所以...

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ALL) , SensorManager.SENSOR_DELAY_GAME);

所以设置监听器 - 监听所有传感器 - 想知道我应该只听两个吗? (这会节省电池吗?)

Sensor mySensor = event.sensor;
// if (mySensor.getType() != Sensor.TYPE_ORIENTATION) return;
if (mySensor.getType() == Sensor.TYPE_ORIENTATION)
{
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];

tv.setText("Rotation around X, Azimuth = " + x);
tv1.setText("Rotation around Y, Pitch = " + y);
tv2.setText("Rotation around Z, Roll = " + z);
}
if (mySensor.getType() == SensorManager.SENSOR_PROXIMITY)
{

float p = event.values[0];
tv3.setText("Proximity = " + p);

}

然后在 onSensorChanged - 见上文

在我的 LG Optimus One 上,我可以让它在方向传感器的 TextView 中显示值(这款手机没有接近传感器)

但是在我的 Nexus One 上运行相同的代码会导致一个漂亮的空白屏幕!?

抱歉这个问题太长了!但任何帮助都会很好,如果您需要更多信息,请询问,LG 手机是 2.2 Nexus One 是 2.2.2谢谢,

大卫

最佳答案

您可以对所有传感器使用相同的监听器。但是如果你真的想监听多个甚至所有的传感器,你需要重写这一行:

mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ALL) , SensorManager.SENSOR_DELAY_GAME);

因为 getDefaultSensor(int type) 的实际实现只返回一个传感器,如源代码所示:

public Sensor getDefaultSensor(int type) {
// TODO: need to be smarter, for now, just return the 1st sensor
List<Sensor> l = getSensorList(type);
return l.isEmpty() ? null : l.get(0);
}

public List<Sensor> getSensorList(int type) {
// cache the returned lists the first time
List<Sensor> list;
final ArrayList<Sensor> fullList = sFullSensorsList;
synchronized(fullList) {
list = sSensorListByType.get(type);
if (list == null) {
if (type == Sensor.TYPE_ALL) {
list = fullList;
} else {
list = new ArrayList<Sensor>();
for (Sensor i : fullList) {
if (i.getType() == type)
list.add(i);
}
}
list = Collections.unmodifiableList(list);
sSensorListByType.append(type, list);
}

return list;
}

所以在 Sensor.TYPE_ALL 的情况下,方法 getSensorList(int type) 提供了所有可用传感器的(无序)列表和 getDefaultSensor(int type) 只返回其中的第一个。

因为包含所有传感器的列表是无序的,所以 getDefaultSensor(Sensor.TYPE_ALL) 提供一个随机传感器。我尝试了一下,首先拿到了加速度计,然后是光传感器。由于您只处理监听器中的方向和接近度变化,我怀疑 getDefaultSensor(Sensor.TYPE_ALL) 在您的 Nexus 上提供了不同的传感器。

您应该收到一个包含所有可用传感器的列表,mSensorManager.getSensorList(Sensor.TYPE_ALL) 并遍历该列表,以便分别注册每个包含的传感器。

关于您关于节省电池的问题 - 我不知道传感器是否一直在运行。即使是这种情况,也可以通过减少不必要的处理来始终节省电池电量。如果您不需要特定传感器提供的信息,请不要注册以接收来自它的消息。这减少了发送到您的应用程序的消息。

关于Android 传感器 - 获取接近传感器值时出现问题以及使用不同手机时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5090495/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com