Я пытаюсь написать приложение для 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 и устанавливаю их в срочном порядке?