如何在屏幕关闭时获取传感器数据?

时间:2017-10-18 08:17:32

标签: android android-sensors

我正在尝试创建一个应用程序,该应用程序使用服务在一定时间内跟踪设备的方向。当方向改变时,设备发出声音。只要设备打开,这就完美地工作了。一旦我锁定设备或屏幕关闭,我就听不到声音(我想要的)。

我的服务代码是

public class RakatTrackingService extends Service implements SensorEventListener {
private SharedPreferences sharedPref;
private long[] sessionComposition = new long[4];
private String position="none", lastPosition ="none";
private SensorManager sensorManager;
private Sensor accelerometer;
private PowerManager.WakeLock wakeLock;

public RakatTrackingService()
{

}
public RakatTrackingService(long[] sessionComposition) {
    this.sessionComposition = sessionComposition;


}

@Override
public void onCreate() {
    super.onCreate();
    SharedPreferences sharedPref = getSharedPreferences("rakatData",Context.MODE_PRIVATE);

    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null)
    {
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        Toast.makeText(this, "sensor registered", Toast.LENGTH_LONG).show();
    }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onSensorChanged(SensorEvent event) {

    lastPosition = position;
    if(Math.abs(event.values[0]) > Math.abs(event.values[1]) && Math.abs(event.values[0]) > Math.abs(event.values[2]))
    {
        position="horizontal-side";
    }
    if(Math.abs(event.values[1]) > Math.abs(event.values[0]) && Math.abs(event.values[1]) > Math.abs(event.values[2]))
    {
        position="vertical";
    }
    if(Math.abs(event.values[2]) > Math.abs(event.values[0]) && Math.abs(event.values[2]) > Math.abs(event.values[1]))
    {
        position="horizontal";
    }


    System.out.println(position);

    if(!lastPosition.equalsIgnoreCase(position))
    {
        MediaPlayer mp = MediaPlayer.create(this, R.raw.click);
        mp.start();
        mp.setLooping(false);
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    PowerManager mgr = (PowerManager)getApplicationContext().getSystemService(Context.POWER_SERVICE);
    wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
    wakeLock.acquire();
    return START_STICKY;

}

@Override
public void onDestroy() {
    super.onDestroy();
    wakeLock.release();
}
}

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

简单地说,你不能。传感器侦听器不起作用,然后屏幕关闭。您需要该应用程序才能使用它。您可以尝试获取PARTIAL_WAKE_LOCKSCREEN_DIM_WAKE_LOCK

答案 1 :(得分:0)

因此,在对inet进行一些挖掘之后,我得出的结论是该服务处于活动状态,但是当屏幕关闭时加速计被禁用。该属性最终是设备和品牌特定的。我现在正在使用屏幕暗淡的唤醒锁来保持屏幕。至于锁定功能,我转向通知用户在使用应用程序时不要锁定屏幕。考虑到应用程序的性质,它可行。