2015-01-12 5 views
3

Я пытаюсь использовать вибрационный шаблон при вибрации телефона. Я использую:Почему мой телефон вибрирует бесконечно?

Vibrator v = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE); 
       // Vibrate for 500 milliseconds 
       long[] longs = { 2, 0, 0, 0, 2, 0 , 0, 0, 2 }; 
       v.vibrate(longs, 1); 

и он просто не перестает вибрировать.

  1. Если я использую v.vibrate(longs, -1);, он не вибрирует вообще.
  2. Если я использую v.vibrate(longs, 0);, он не вибрирует вообще.
  3. Если я использую v.vibrate(longs, 2); или любое число выше 1, оно вибрирует бесконечно.
  4. Если я изменю длинные значения, чтобы они были выше или ниже, это не имеет значения.

Я прочитал documentation и некоторые tutorials, и я не думаю, что я сделал что-то здесь не так. Почему он не вибрирует правильно?

Примечание: Я использую другие приложения, которые вибрируют в шаблонах правильно, поэтому я знаю, что это не проблема с моим телефоном.

+0

Я добавляю свой собственный ответ, поскольку нашел решение. Я не понимаю его, поэтому, если кто-то может добавить объяснение _why_ этого кода, я собираюсь добавить работы, как ожидалось, тогда это будет здорово. –

+0

Я не вижу связи между комментарием '// Вибрация за 500 миллисекунд ' и код. – njzk2

+0

@ njzk2 Это неуважение. Я просто не удалил комментарий после небольшого изменения кода. –

ответ

5

Вы должны прочитать документацию для vibrate().

С 2, 0, 0, 0, 2, 0 , 0, 0, 2 вы говорите: «подождите 2 мс, вибрируйте за 0 мс, ждите 0 мс, вибрируйте за 0 мс, ждите 2 мс, вибрируйте за 0 мс, ждите 0 мс, вибрируйте за 0 ms, подождите 2 мс ". Очевидно, что этот шаблон никогда не вибрирует, если вы не повторите шаблон (который имеет нечетное количество интервалов).

Когда вы передаете в качестве второго аргумента что-либо, кроме -1, шаблон повторяется с использованием второго аргумента в качестве индекса в шаблон, с которого следует начинать повторять. Поскольку вы никогда не звоните v.cancel(), это повторение никогда не заканчивается, вызывая бесконечную вибрацию (потому что в какой-то момент повторения вы будете иметь интервал колебаний без 0).

+0

Спасибо @cybersam, я изначально прочитал документацию. Не знаю, как мне удалось пропустить ту часть, где они говорят о включении. –

1

Код со второго ответа на this page работает на меня. Она вибрирует в схеме, а затем останавливается, как только картина закончена:

// Get instance of Vibrator from current Context 
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 

// Start without a delay 
// Vibrate for 100 milliseconds 
// Sleep for 1000 milliseconds 
long[] pattern = {0, 100, 1000}; 

// The '0' here means to repeat indefinitely 
// '0' is actually the index at which the pattern keeps repeating from (the start) 
// To repeat the pattern from any other point, you could increase the index, e.g. '1' 
v.vibrate(pattern, 0); 
2

Почему не вибрирует правильно?

Ну ...

Во-первых, ноль миллисекунд действительно короткий промежуток времени. Пользователи не заметят вибрации, которая происходит за нулевые миллисекунды, и пользователи не заметят разрыв между вибрациями, которые происходят в течение нулевого миллисекунды.

Во-вторых, два миллисекунды - очень короткое время. Весь ваш шаблон занимает шесть миллисекунд за каждый проход (с повторным значением 0) или четыре миллисекунды для второго и последующих проходов (с повторным значением 1, так как это пропускает первый элемент вашего шаблона, который является одним из ваших три двух миллисекундных значения). Есть сотни этих шаблонов в секунду, которые пользователь не будет распознавать.

Я предлагаю вам избавиться от нулей и использовать разумные количества миллисекунд для остальных.Это относится к предложениям киберсама, которые в конечном итоге вызвали cancel() и подумали, хотите ли вы иметь четное или нечетное число элементов в вашем шаблоне.

Смежные вопросы