Тревога Android - активность иногда остается черной после увольнения с клавиатуры - PullRequest
0 голосов
/ 14 ноября 2018

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

Теперь, хотя экран черный, представления реагируют на прикосновения

Если я пытаюсь сделать снимок экрана, я внезапно вижу активность, и если я выключаю и снова включаю экран, все работает, как ожидалось.

Кажется, я не могу воспроизвести это на моей отладочной сборке , но время от времени это случается со мной на "производственной" сборке.(Допустим, 1/5 раза)

Это произойдет утром между повторами, но никогда при первой тревоге.(насколько я заметил)

Любая идея о том, что вызывает это или как воспроизвести это, очень поможет.

Видео странностей:

Отзывчивый черный экран

Выключить и снова включить

Попытка сделать снимок экрана

Вот как я запускаю упражнение:

val builder = NotificationCompat.Builder(context, NotificationChannels.CHANNEL_ALARM_SERVICE)
...
// set intent
val alarmIntent = Intent(context, AlarmActivity::class.java)
alarmIntent.putExtra(IntentExtras.KEY_ID, alarm.id)
builder.setFullScreenIntent(PendingIntent.getActivity(context, RequestCodes.REQUEST_CODE_ALARM_ACTIVITY, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT), true)
...
startForeground(...)

Так я разблокирую экран в упражнении onCreate() метод

public class ScreenUnlockerUtil {

    public static void unlockScreen(BaseActivity activity) {

        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
            // in addition to flags
            activity.setShowWhenLocked(true);
            activity.setTurnScreenOn(true);
        } else {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        }


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            KeyguardManager keyguardManager = (KeyguardManager) activity.getSystemService(KEYGUARD_SERVICE);
            if (keyguardManager != null) {
                keyguardManager.requestDismissKeyguard(activity, new KeyguardManager.KeyguardDismissCallback() {
                    @Override
                    public void onDismissError() {
                        super.onDismissError();
                        ExceptionHandlerWrapper.reportException(new Exception("Keyguard Dismiss Error"));
                    }

                    @Override
                    public void onDismissSucceeded() {
                        super.onDismissSucceeded();
                        Timber.d("Keyguard Dismiss Success");
                    }

                    @Override
                    public void onDismissCancelled() {
                        super.onDismissCancelled();
                        ExceptionHandlerWrapper.reportException(new Exception("Keyguard Dismiss Cancelled"));
                    }
                });
            }
        } else {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        }


    }
}

Редактировать 1: Яя не вижу никаких сообщений от моего устройства относительно отмены или ошибки увольнения с клавиатуры.

Редактировать 2: Все это происходит на Pixel 2 XL.Не какой-то случайный дерьмовый телефон.

1 Ответ

0 голосов
/ 26 декабря 2018

Очень странная проблема, я не мог найти точную причину для этого. Но я мог бы придумать очень стабильное решение, просто добавьте следующие параметры в ваш файл манифеста, и оно должно работать. Я пробовал это 15 раз и никогда больше не сталкивался с этой проблемой, в то время как у меня это было 1 из 5 раз с решением кода.

Не забудьте удалить строки кода в вашем onCreate.

    <activity android:name=".AlertActivity"
        android:showWhenLocked="true"
        android:turnScreenOn="true">
    </activity>
...