Вызов функции вибрации Android Vibrator несколько раз останавливает вибрацию - PullRequest
0 голосов
/ 30 мая 2018

Мое приложение должно реагировать на вибрацию, когда номер отправляет текстовое сообщение.Вибрация должна продолжаться, пока пользователь не коснется кнопки.При тестировании приложения я отправляю несколько текстовых сообщений с разных устройств, в том числе с проверенным номером.Мне всегда удается отправлять тексты, которые просто остановят вибрацию, хотя регистрация показывает, что вибрация должна была начаться, но она не продолжалась.Это могло произойти через 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 сообщений между ними?

...