Вибрация приложения Android Wear OS иногда не работает - PullRequest
0 голосов
/ 27 мая 2018

Я занимаюсь разработкой приложения Android Wear OS 2.0.Каждый раз, когда пользователь получает SMS с заданного номера, часы должны начать вибрировать, и должен появиться пользовательский интерфейс с заданным текстом с кнопкой, которая останавливает вибрацию.Это работает следующим образом:

В SmsReciever.java я проверяю, совпадает ли номер телефона, или экран UI уже активен.

public class SmsReceiver extends BroadcastReceiver {

    //interface
    private static SmsListener mListener;

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle data  = intent.getExtras();

        Object[] pdus = (Object[]) data.get("pdus");

        for(int i=0;i<pdus.length;i++){
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i], "3gpp");

            String sender = smsMessage.getDisplayOriginatingAddress();

            String alertPhoneNumber = "301112233";
            if (sender.toLowerCase().contains(alertPhoneNumber.toLowerCase()))
            {

                String messageBody = smsMessage.getMessageBody();

                //Pass the message text to interface
                mListener.messageReceived(messageBody);

            } else if (AlarmActivity.active) {
                Intent intent1 = new Intent();
                intent1.setClassName("hu.asd.watchtest", "hu.asd.watchtest.AlarmActivity");
                intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent1);
            }
        }
    }

    public static void bindListener(SmsListener listener) {
        mListener = listener;
    }
}

Мне нужениначе если часть, потому что иногда, когда пользовательский интерфейс был активен, и я получил новое сообщение, вибрация прекращалась.Таким образом, эта часть начинает AlarmActivity (который обрабатывает вибрацию).

В MainActivity.java я связываю нового слушателя, поэтому теперь каждый раз, когда я получаю правильное сообщение в SmsReciever,AlarmActivity должен запуститься:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    requestPermissions(Manifest.permission.RECEIVE_SMS, PERMISSIONS_REQUEST_RECEIVE_SMS);

    SmsReceiver.bindListener(new SmsListener() {

        @Override
        public void messageReceived(String messageText) {
            Intent myIntent = new Intent(MainActivity.this, AlarmActivity.class);
            MainActivity.this.startActivity(myIntent);
        }
    });
}

В AlarmActivity.java приложение пробуждает экран, затем получает Vibrator, устанавливает onClickListeners на кнопку остановки вибрации и затем запускает фактическую вибрацию.Я также изменяю активное состояние здесь:

public class AlarmActivity extends WearableActivity {

    static boolean active = false;

    @Override
    public void onResume() {
        super.onResume();
        active = true;
    }

    @Override
    public void onStart() {
        super.onStart();
        active = true;
    }

    @Override
    public void onStop() {
        super.onStop();
        active = false;
    }

    @Override
    public void onPause() {
        super.onPause();
        active = false;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_alarm);
        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        final PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
            "MyWakelockTag");
        wakeLock.acquire();

        findViewById(R.id.stop_button).getBackground().setLevel(5000);

        final Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
        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};

        final Button stopButton = findViewById(R.id.stop_button);
        stopButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                vibrator.cancel();
                wakeLock.release();

                new SendEmail().execute();

                Intent myIntent = new Intent(AlarmActivity.this, MainActivity.class);
                AlarmActivity.this.startActivity(myIntent);
            }
        });

        setAmbientEnabled();
        vibrator.vibrate(VibrationEffect.createWaveform(mVibratePattern, mAmplitudes, 0)); // 0 to repeat endlessly.
    }
}

Если пользователь нажимает кнопку, тогда MainActivity запускается снова.Проблема в том, что из 50 случаев я могу отправить несколько текстовых сообщений, часы будут вибрировать, пока я не нажму кнопку «Стоп», но в 1 случае они будут вибрировать только один раз, затем они перестанут вибрировать.Обычно это происходит, если AlarmActivity уже активен и вибрирует, или вибрация была отменена ранее.Я предполагаю, что я много работаю с намерениями, или с экземплярами Vibrator?Или когда я получаю новый текст, часы требуют Вибратор, а мое приложение не может его получить?

Это мое первое приложение для Android, и я пробовал много разных реализаций, но все еще не совершенен.

...