2016-11-04 3 views
0

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

Это также необходимо сделать, когда приложение переходит в режим окружающего звука или начинает работать на полном черном экране. Я не забочусь о потреблении энергии и т. Д., Он должен просто работать как 20-30 минут, ничего больше.

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

При работе с событиями onEnterAmbient и т. Д. Часы перестают вибрировать, когда вы не держите их под прямым углом из-за входа в черный экран, а также вибрация не всегда согласована, из-за необходимости вызвать vibrator.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#UpdateContent), чтобы иметь возможность также передавать вибрации, когда в Blackscreen, но, как выясняется, таймер для будильника не может быть установлен на такие небольшие интервалы? Она вибрирует только каждый около 5 секунд, так как предполагается 1s и менее независимо от того, чтобы быть в черном экране или нормальной или окружающей среды режиме ...

Код:

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 событий и т. д., но не работает так, как предполагается. Есть ли способ делать такие вещи на smartwatch, особенно на Moto 360?

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

ответ

0

Решение было использовать CPU 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); 
Смежные вопросы