Java 后台服务中的sensorManager.registerListener

Java 后台服务中的sensorManager.registerListener,java,android,cordova,cordova-plugins,Java,Android,Cordova,Cordova Plugins,我有一个为Cordova应用编写的Android后台服务,我想通过sensorManager与加速计交互 我觉得我已经很接近了,但我想还不是很接近 出于某种原因,sensorManager.registerListener似乎没有启动onSensorChanged方法-我正在从MyService(我的后台服务类)每隔5秒检查一次X值 从我所读到的内容来看,这与在registerListener上需要一个句柄有关,但我不确定…什么或如何 以下是我的代码(为了可读性而删减): 类AccelListe

我有一个为Cordova应用编写的Android后台服务,我想通过sensorManager与加速计交互

我觉得我已经很接近了,但我想还不是很接近

出于某种原因,sensorManager.registerListener似乎没有启动onSensorChanged方法-我正在从MyService(我的后台服务类)每隔5秒检查一次X值

从我所读到的内容来看,这与在registerListener上需要一个句柄有关,但我不确定…什么或如何

以下是我的代码(为了可读性而删减):

类AccelListener实现SensorEventListener { 公共AccelListener(上下文ctx){ mCtx=ctx; sensorManager=(sensorManager)mCtx.getSystemService(Context.SENSOR\u SERVICE); } 公共int start(){ 列表=this.sensorManager.getSensorList(Sensor.TYPE\u加速计); 如果((list!=null)&&(list.size()>0)){ this.mSensor=list.get(0); this.sensorManager.registerListener(this,this.mSensor,sensorManager.SENSOR\u DELAY\u UI); } 返回此状态; } 传感器更改时的公共无效(传感器事件){ if(this.accurity>=SensorManager.SENSOR\u STATUS\u accurity\u MEDIUM){ this.timestamp=System.currentTimeMillis(); this.x=事件值[0]; this.y=event.values[1]; this.z=event.values[2]; } } } 公共类MyService扩展了BackgroundService { 受保护的JSONObject doWork(){ JSONObject结果=新建JSONObject(); 上下文thisContext=getApplicationContext(); AccelListener objAccel=新AccelListener(thisContext); int intAccelReturn=objAccel.start(); setInterval(函数() { 结果.put(“输出”,objAccel.x); },5000); } 非常感谢您的帮助

谢谢


我不知道这是否是你的问题,但我认为

List<Sensor> list = this.sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
if ((list != null) && (list.size() > 0)) {
  this.mSensor = list.get(0);
  this.sensorManager.registerListener(this, this.mSensor, SensorManager.SENSOR_DELAY_UI);
}
您的问题可能是您从未调用函数
start
(或者至少在发布的代码中没有这样做)。
你能在AccelReturn中打印
的值吗
。这可能会提供发生什么事情的线索。你确定你的手机确实有加速计吗?最好在
onSensorChanged
功能中添加
@Override
注释(这样,如果超类中没有具有该名称的函数,则会出现错误)。请参阅如何创建后台服务。您也不调用
MyService.doWork
(您是否在实际代码中调用了该函数)。

这两者之间的另一个区别

List<Sensor> list= 
this.sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
if ((list != null) && (list.size() > 0)) {
  this.mSensor = list.get(0);
  this.sensorManager.registerListener(this, this.mSensor,     
  SensorManager.SENSOR_DELAY_UI);
}
是否在第二个示例中引用了DefaultSensor,而不是列表中的任何传感器。是否确定索引0处的传感器实例就是您要引用的传感器实例


BR

使您的类本身成为一项服务

public class AccelListener extends Service implements SensorEventListener{...}
在您的初始化方法(startCommand、constructor、intentReceived或任何您使用的方法)中,进行初始化:

    if (mSensorManager==null){
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    }

    if (mSensorAccelerometer == null){ 
        mSensorAccelerometer = mSensorManager.getDefaultSensor(Sensor. TYPE_ACCELEROMETER);
        mSensorManager.registerListener(this, mSensorAccelerometer, SensorManager.SENSOR_DELAY_UI);
    }   
然后覆盖onSensorChanged

@Override
public void onSensorChanged(SensorEvent event) { 
    // do stuff
}
有些东西需要检查

  • 是否实际调用了
    onSensorChanged
    ,但因为您有一个精度测试,它被丢弃了?我可以想象,由于UI速率每秒仅提供大约2-3个样本,它可能不被认为是准确的,但它足以知道您是否应该旋转屏幕
  • 设备是否正在移动以进行此测试,还是只是放在您的桌面上?只有在发生变化(设备正在移动)时才会报告这些值,因此空闲设备不应提供任何样本
  • 屏幕已关闭,并且您没有
    部分唤醒锁定
    。如果您希望加速计在屏幕关闭时继续向您发送样本,则需要部分唤醒锁定以防止CPU休眠(如果不释放唤醒锁定,可能会影响电池寿命)。它需要
    android.permission.WAKE_LOCK
    中的
    AndroidManifest.xml
    。然后在开始时,您必须执行以下操作:
  • `


    `

    该死,我还以为你破解了呢!!!-但意识到我刚刚错过了发帖代码的开头()-我现在已经编辑好了-有什么想法吗?
    public class AccelListener extends Service implements SensorEventListener{...}
    
        if (mSensorManager==null){
            mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        }
    
        if (mSensorAccelerometer == null){ 
            mSensorAccelerometer = mSensorManager.getDefaultSensor(Sensor. TYPE_ACCELEROMETER);
            mSensorManager.registerListener(this, mSensorAccelerometer, SensorManager.SENSOR_DELAY_UI);
        }   
    
    @Override
    public void onSensorChanged(SensorEvent event) { 
        // do stuff
    }
    
    // Assuming mLock is a class level PowerManager.WakeLock so it can be released later
    PowerManager pm = (PowerManager)mCtx.getSystemService(Context.POWER_SERVICE);
    
    mLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Accel");
    mLock.acquire();