2017-10-18 7 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

関連する問題