Мое приложение должно реагировать на вибрацию, когда номер отправляет текстовое сообщение.Вибрация должна продолжаться, пока пользователь не коснется кнопки.При тестировании приложения я отправляю несколько текстовых сообщений с разных устройств, в том числе с проверенным номером.Мне всегда удается отправлять тексты, которые просто остановят вибрацию, хотя регистрация показывает, что вибрация должна была начаться, но она не продолжалась.Это могло произойти через 2 или после 40 сообщений случайным образом.
Я думал, что вибрация устройства может как-то мешать моей вибрации, одновременно получая доступ к Vibrator
.
Или, так как это первое, что я делаю с Android, я делаю что-то не так.
Вот мой класс AlarmActivity.java
, который обрабатывает вибрацию, он всегда вызывается из MainActivity
черезНамерение, когда новое сообщение получено:
public class AlarmActivity extends WearableActivity {
static boolean active = false;
static boolean isVibrating = false;
private Vibrator vibrator;
final long[] mVibratePattern = new long[]{0, 400, 800, 600, 800, 800, 800, 1000};
final int[] mAmplitudes = new int[]{0, 255, 0, 255, 0, 255, 0, 255};
private PowerManager.WakeLock wakeLock;
@Override
public void onResume() {
super.onResume();
active = true;
}
@Override
public void onStart() {
super.onStart();
active = true;
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
"MyWakelockTag");
if ((wakeLock != null) && // we have a WakeLock
(!wakeLock.isHeld())) { // but we don't hold it
wakeLock.acquire();
}
vibrate();
}
@Override
public void onStop() {
super.onStop();
active = false;
if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release();
}
}
@Override
public void onPause() {
super.onPause();
active = false;
if (isVibrating) {
vibrate();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm);
findViewById(R.id.stop_button).getBackground().setLevel(5000);
final Button stopButton = findViewById(R.id.stop_button);
stopButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
vibrator.cancel();
isVibrating = false;
if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release();
}
if (isOnline()) {
new SendEmail().execute();
}
Intent myIntent = new Intent(AlarmActivity.this, MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
AlarmActivity.this.startActivity(myIntent);
}
});
setAmbientEnabled();
}
public boolean isOnline() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
public void vibrate() {
if (vibrator == null) {
System.out.println("--------- CREATING VIBRATOR ------------");
vibrator = (Vibrator) getApplicationContext().getSystemService(VIBRATOR_SERVICE);
}
vibrator.vibrate(VibrationEffect.createWaveform(mVibratePattern, mAmplitudes, 0)); // 0 to repeat endlessly.
isVibrating = true;
}
}
Я также попытался cancel()
вибратор прямо перед повторным вызовом vibrate()
, но это прекратило вибрацию сразу после отправки второго текста из проверенногономер без нажатия кнопки остановки.Как я могу упростить это, или убедиться, что он работает и вибрирует до тех пор, пока пользователь не нажмет кнопку, даже если я получу 100 сообщений между ними?