Страница 1 из 1

Работа шагомера при заблокированном экране

Добавлено: 30 июл 2015, 15:19
dosssik
Друзья, добрый день!
Буду очень признателен, если поможете советом. Разбирался с темой сенсоров, и в качестве эксперимента, для себя, решил написать простенький шагомер, работающий на базе сенсора STEP_DETECTOR. Все замечательно, вот только он ни в какую не хочет работать при заблокированном экране. Wake lock'ом проблема так же не разрешилась( третий день голову ломаю, но не могу понять, как заставить его работать.

В наличии всего два класса - Activity и Service. В activity только пара кнопок по которым стартует и завершается сервис. Вся логика находится в сервисе.
Собственно, код:

Код: Выделить всё


import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.os.PowerManager;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;

import java.util.Arrays;

public class MyFirstService extends Service implements SensorEventListener {

    private SensorEventListener sel;
    private static final String TAG = "MYSERVICE666";
    private PowerManager.WakeLock wakeLock;
    SensorManager sm;


    public MyFirstService() {
        super();
        Log.d(TAG, "constructor " + Thread.currentThread().getName());
    }


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

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate" + Thread.currentThread().getName());

        acquireWakeLock();
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onStartCommand " + Thread.currentThread().getName());



        sm = (SensorManager) getSystemService(SENSOR_SERVICE);
        Sensor s = sm.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
        sm.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL);

        NotificationManager myNotif = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Intent bIntent = new Intent(MyFirstService.this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(MyFirstService.this, 0, bIntent, 0);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.abc_ic_clear_mtrl_alpha)
                .setContentTitle("Title")
                .setContentText("ANything")
                .setAutoCancel(true)
                .setContentIntent(pendingIntent);
        Notification notification = builder.build();

        this.startForeground(565656, notification);
        return START_STICKY;
    }


    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy" + Thread.currentThread().getName());
        sm.unregisterListener(sel);
        wakeLock.release();
        super.onDestroy();
    }


    public void acquireWakeLock() {
        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "MyWakelockTag");
        wakeLock.acquire();
    }


    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        Log.d(TAG, "onSensorChanged " + Thread.currentThread().getName() +
                ". SensorEvent - " + Arrays.toString(sensorEvent.values));

    }

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

    }
}

В манифесте соответствующий wake lock пермишн стоит.

Если телефон вывести из спячки нажатием power, но экран не разлочивать, то сенсор оживает и работает, пока не потухнет экран. Соответственно, выходит, что у меня не работает wakeLock, или в чем проблема?
Заранее большое спасибо! :geek:

p.s.
За показаниями сенсора наблюдаю по логу, в UI пока ничего не выводил.