Частые носимые вибрации с Ambient/Blackscreen

Я пытаюсь написать приложение для SmartWatch, которое имитирует ваше сердцебиение, поэтому оно должно иметь возможность вибрировать с интервалами времени от 1 с до 0,5-0,3 с в течение 75 мс.

Это также необходимо сделать, когда приложение переходит в режим окружающей среды или начинает работать полностью на черном экране. Меня не волнует энергопотребление или что-то в этом роде, он должен работать в течение 20-30 минут, ничего больше.

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

При работе только с событиями onEnterAmbient и т. Д. Часы перестают вибрировать, если вы не удерживаете их под прямым углом из-за перехода в черный экран, а также вибрация не всегда постоянна из-за необходимости вызывать вибратор.vibrate() метод снова при вводе / обновлении и т. д., что обычно приводит к небольшому несоответствию в схеме вибрации, которого следует избегать. Так что подход с использованием ambientmode не работает, я думаю.

Вот прежний кодекс:

[...]
private long[] vibrationPattern_StandardPulse = {0, 75, 1000};
private long[] vibrationPattern_AcceleratedPulse = {0, 75, 600};
[...]
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setAmbientEnabled();
    mContainerView = (BoxInsetLayout) findViewById(R.id.container);
    vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
[...]
@Override
public void onEnterAmbient(Bundle ambientDetails) {
    super.onEnterAmbient(ambientDetails);
    keepVibrating();
}

@Override
public void onUpdateAmbient() {
    super.onUpdateAmbient();
    keepVibrating();
}

@Override
public void onExitAmbient() {
    super.onExitAmbient();
    keepVibrating();
[...]
 public void keepVibrating() {
    if (standardPulse) {
        vibrator.vibrate(vibrationPattern_StandardPulse, 0);
    } else {
        vibrator.vibrate(vibrationPattern_AcceleratedPulse, 0);
    }
}
[...]

Поэтому я попробовал это снова с помощью alarmmanager (придерживаясь этой ссылки: https://developer.android.com/training/wearables/apps/always-on.html), чтобы иметь возможность отправлять вибрации, когда в Blackscreen, но как получается, таймер для AlarmManager не может быть установлен на такие маленькие интервалы? Он вибрирует примерно каждые 5 с, как предполагается, до 1 с и менее, независимо от того, находится ли он на черном экране, в нормальном или окружающем режиме...

Код:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setAmbientEnabled();
    mAmbientStateAlarmManager =
            (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent ambientStateIntent =
            new Intent(getApplicationContext(), MainActivity.class);

    mAmbientStatePendingIntent = PendingIntent.getActivity(
            getApplicationContext(),
            0,
            ambientStateIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    mContainerView = (BoxInsetLayout) findViewById(R.id.container);
    //mClockView = (TextView) findViewById(R.id.clock);
    vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
[...]}
@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    setIntent(intent);

    refreshDisplayAndSetNextUpdate();
}

private long AMBIENT_INTERVAL_MS = 0;

private void refreshDisplayAndSetNextUpdate() {
    if (standardPulse) {
        AMBIENT_INTERVAL_MS = 1000;
    } else {
        AMBIENT_INTERVAL_MS = 600;
    }

    if (isAmbient()) {
        // Implement data retrieval and update the screen for ambient mode
        vibrator.vibrate(75);
    } else {
        // Implement data retrieval and update the screen for interactive mode
        vibrator.vibrate(75);
    }

    long timeMs = System.currentTimeMillis();

    // Schedule a new alarm
    if (isAmbient()) {
        // Calculate the next trigger time
        long triggerTimeMs = timeMs + AMBIENT_INTERVAL_MS;

        mAmbientStateAlarmManager.setExact(
                AlarmManager.RTC_WAKEUP,
                triggerTimeMs,
                mAmbientStatePendingIntent);

    } else {
        // Calculate the next trigger time for interactive mode
        long triggerTimeMs = timeMs + AMBIENT_INTERVAL_MS;

        mAmbientStateAlarmManager.setExact(
                AlarmManager.RTC_WAKEUP,
                triggerTimeMs,
                mAmbientStatePendingIntent);
    }
}

RefreshUpdateAndSetNextAlarm затем вызывается также в событиях onEnterAmbient и т. Д., Но не работает, как положено. Есть ли способ сделать такие вещи на умных часах, особенно на Moto 360?

Может быть, если я буду постоянно отправлять сообщения со смартфона через messageAPI и устанавливать их как срочные?

1 ответ

Решение

Решение было использовать процессор Wakelock:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
            "MyWakelockTag");
wakeLock.acquire();

и экран держать на флаге:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Другие вопросы по тегам