簡體   English   中英

屏幕關閉時如何獲取傳感器數據?

[英]How to get sensor data in service when screen is turned off?

我正在嘗試創建一個應用程序,該應用程序使用服務在一定時間內跟蹤設備的方向。 當方向改變時,設備會發出聲音。 只要設備處於開啟狀態,它就可以完美運行。 一旦我鎖定設備或屏幕關閉,我就聽不到聲音(我想要)。

我的服務代碼是

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();
}
}

請幫我解決這個問題。

簡直你做不到。 傳感器偵聽器無法正常工作,然后屏幕關閉。 您需要激活該應用才能使用它。 您可以嘗試獲取PARTIAL_WAKE_LOCKSCREEN_DIM_WAKE_LOCK

因此,在深入研究inet之后,我得出一個結論,即該服務已啟用,但在關閉屏幕時,加速度計被禁用。 該屬性證明是特定於設備和品牌的。 我現在正在使用屏幕暗淡的喚醒鎖來保持屏幕打開。 至於鎖定功能,我要通知用戶在使用該應用時不要鎖定屏幕。 考慮到應用程序制作的性質,它是可行的。

您可以使用帶有通知的前台服務,但是當屏幕關閉時,某些傳感器會在一段時間后被禁用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM