2017-10-18 71 views
0

我正在嘗試創建一個應用程序,該應用程序使用服務在一定的時間內跟蹤設備的方向。當方向改變時,設備發出聲音。只要設備處於打開狀態,此功能就可以正常工作。只要我鎖定設備或屏幕關閉,我聽不到聲音(我想要)。如何在屏幕關閉時獲取傳感器數據?

我的服務代碼是

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

請幫我解決這個問題。

+0

您必須在活動中廣播數據並使用WakefulBroadcastReceiver嘗試播放聲音 –

+0

您是指將傳感器數據發送回活動? –

+0

是通過從服務發送數據到活動 –

回答

0

只是你不能。傳感器偵聽器無法正常工作,屏幕關閉。您需要該應用程序才能使用它。您可以嘗試獲取PARTIAL_WAKE_LOCKSCREEN_DIM_WAKE_LOCK

+0

我已經在onStartCommand方法中添加了一個wakelock,當服務被銷燬但聲音仍然不起作用時,我會釋放它。 –

+0

您是如何使用傳感器的?如果您使用的是MediaPLayer,則必須在後臺工作 – webo80

+0

必須正常工作,應該與我發佈的代碼一起工作? –

0

因此,在對inet進行了一些挖掘之後,我得出結論:服務處於活動狀態,但在屏幕關閉時加速度計會被禁用。該屬性原來是設備和品牌特定的。我現在使用屏幕昏暗的泡沫保持屏幕。至於鎖定功能,im轉向通知用戶在使用應用程序時不要鎖定屏幕。它可以考慮應用程序的性質。

+0

完美!這就是我所說的 – webo80

相關問題