为什么我的手机会无限震动?

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. 如果我更改长整型值使其更高或更低,没有任何区别。
我已经阅读了文档和一些tutorials,我不认为在这里做错了什么。为什么它不能正确地振动?
注意:我使用其他应用程序可以正确地以模式振动,所以我知道这不是我的手机的问题。

我正在添加我的答案,因为我已经找到了解决方案。不过,我并不理解,所以如果有人可以添加关于为什么我即将添加的代码按预期工作的说明,那就太好了。 - RǢF
我看不出注释“//震动500毫秒”和代码之间的关系。 - njzk2
@njzk2 这不相关。我只是在修改代码后没有删除注释。 - RǢF
3个回答

5

您应该阅读vibrate()的文档。

使用2, 0, 0, 0, 2, 0 , 0, 0, 2,表示“等待2毫秒,震动0毫秒,等待0毫秒,震动0毫秒,等待2毫秒,震动0毫秒,等待0毫秒,震动0毫秒,等待2毫秒”。显然,除非重复模式(具有奇数个间隔),否则此模式永远不会震动。

当您将第二个参数设置为-1以外的任何值时,模式将使用第二个参数作为模式在其开始重复的索引进行重复。由于您似乎从未调用过v.cancel(),因此这种重复永远不会在结束,导致无限振动(因为在重复的某个点上,您将具有非0的振动间隔)。


谢谢@cybersam,我最初确实阅读了文档。不知道我怎么错过了他们谈论开关的部分。 - RǢF

2
为什么它不能正常震动?
首先,0毫秒时间非常短。用户不会注意到持续0毫秒的震动,也不会注意到间隔为0毫秒的震动。
其次,2毫秒时间非常短。每个模式需要6毫秒才能完成一次循环(重复值为0),或者对于第二次及以后的循环只需要4毫秒(重复值为1,因为这样可以跳过模式中的第一个元素,即三个2毫秒值之一)。每秒会有数百个这样的模式,用户无法分辨。
建议删除0,并使用合理的毫秒数。此外,还要考虑cybersam的建议,最终调用cancel()并思考您想在模式中包含奇数还是偶数个元素。

1
第二个答案中此页面的代码对我有效。它会以一定的模式震动,当模式完成后停止:
// 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接