Как поставить на паузу хронометр при заблокированных экранах телефонов

Я пытался разработать приложение, которое может записывать, сколько времени люди проводят на своем мобильном телефоне. Предполагается запустить хронометр, как только я открою приложение, и сделать паузу, пока экран заблокирован. Проблема в том, что я могу остановить это с помощью кнопки паузы, но я не могу сделать это с помощью блокировки телефона.

package com.example.tony.screentimecounter812;

import android.annotation.TargetApi;
import android.app.KeyguardManager;
import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemClock;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Chronometer;

public class MainActivity extends AppCompatActivity {
    public Chronometer chronometer;
    private long pauseOffset;
    public boolean running = false;
    boolean screenStill = true;

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public void screenStill () {
        chronometer.start();
        while (screenStill) {
            KeyguardManager mKeyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);

            if (running) {
                assert mKeyguardManager != null;
                if (mKeyguardManager.isKeyguardLocked()) {
                    chronometer.stop();
                    pauseOffset = SystemClock.elapsedRealtime() - chronometer.getBase();
                    running = false;
                }
            }
            if (!running) {
                assert mKeyguardManager != null;
                if (!mKeyguardManager.isKeyguardLocked()) {
                    chronometer.start();
                    chronometer.setBase(SystemClock.elapsedRealtime() - pauseOffset);
                    running = true;
                }
            }
        }
    }



    @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chronometer = findViewById(R.id.chronometer);
        screenStill ();


}

1 ответ

Вы можете проверить, включен ли экран телефона, а не заблокирован ли он

Это можно сделать с помощью:

PowerManager powermanager = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = powermanager.isInteractive();

"Когда этот метод возвращает значение true, устройство находится в активном состоянии и готово взаимодействовать с пользователем (хотя это не является гарантией того, что пользователь активно взаимодействует с устройством именно в этот момент). Главный экран обычно включается в этом состоянии ". https://developer.android.com/reference/android/os/PowerManager

Это работает как обходной путь, но результаты могут немного отличаться. Например, я не уверен, что этот метод также возвращает true, когда экран включается из-за уведомления!

Другие вопросы по тегам