2017-10-18 9 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_LOCK 또는 SCREEN_DIM_WAKE_LOCK

+0

onStartCommand 메소드에서 wakelock을 추가했으며 서비스가 삭제되었지만 여전히 사운드가 작동하지 않으면이를 릴리스합니다. –

+0

어떻게 센서를 사용하고 있습니까? MediaPLayer를 사용하는 경우 백그라운드에서 작동해야합니다. – webo80

+0

은 내가 게시 한 코드로 작동해야합니다. –

0

그래서 inet에서 조사한 결과 서비스가 실행 중이지만 화면이 꺼지면 가속도계가 비활성화 된 것으로 나타났습니다. 이 속성은 장치 및 브랜드에 따라 다릅니다. 나는 화면을 계속 켜기 위해 희미한 화면 흔들기를 사용 중입니다. 자물쇠 기능에 관해서는, 앱을 사용하는 동안 화면을 잠그지 않도록 사용자에게 알리기로 전환했습니다. 앱 만들기의 본질을 고려한 작업이 가능합니다.

+0

완벽한! 이것은 내가 말한 것이다. – webo80