¿Por qué mi teléfono vibra indefinidamente?

Estoy tratando de usar un patrón de vibración al vibrar el teléfono. Estoy usando:

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); 

y simplemente no deja de vibrar.

  1. Si utilizo v.vibrate(longs, -1); no vibra en absoluto.
  2. Si utilizo v.vibrate(longs, 0); no vibra en absoluto.
  3. Si utilizo v.vibrate(longs, 2); o cualquier número superior a 1, vibra indefinidamente.
  4. Si cambio los valores largos para que sean más altos o más bajos no hace ninguna diferencia.

He leído la documentación y algunas tutarias y no creo haber hecho nada malo aquí. ¿Por qué no está vibrando correctamente?

Nota: Utilizo otras aplicaciones que vibran en los patrones correctamente, así que sé que no es un problema con mi teléfono.

Usted debe leer la documentación para vibrar () .

Con 2, 0, 0, 0, 2, 0 , 0, 0, 2 , usted está diciendo: "espere 2 ms, vibre durante 0 ms, espere 0 ms, vibre durante 0 ms, espere 2 ms, vibre para 0 ms, espere 0 ms, vibre durante 0 ms, espere 2 ms ". Obviamente, este patrón nunca vibra, a menos que repita el patrón (que tiene un número impar de intervalos).

Cuando se pasa algo distinto de -1 como el segundo argumento, el patrón se repite utilizando el segundo argumento como el índice en el patrón en el que comenzar a repetir. Puesto que nunca pareces llamar v.cancel() , esta repetición nunca termina, causando una vibración sin fin (porque en algún punto de la repetición tendrás un intervalo de vibración no-0).

¿Por qué no está vibrando correctamente?

Bien…

En primer lugar, cero milisegundos es un tiempo muy corto. Los usuarios no se darán cuenta de una vibración que está ocurriendo durante cero milisegundos, y los usuarios no se dará cuenta de una brecha entre las vibraciones que está sucediendo durante cero milisegundos.

En segundo lugar, dos milisegundos es un tiempo muy corto. Su patrón entero toma seis milisegundos por cada pasada (con un valor de repetición de 0 ), o cuatro milisegundos para la segunda y posteriores pasadas (con un valor de repetición de 1 , ya que omite el primer elemento de su patrón, que es uno de los tres valores de dos milisegundos). Hay cientos de estos patrones por segundo, que no va a ser discernible por el usuario.

Le sugiero que se deshaga de los ceros y utilice un número razonable de milisegundos para el resto. Esto está en la parte superior de las sugerencias de cybersam de eventualmente llamar a cancel() y pensar si quieres un número par o impar de elementos en tu patrón.

El código de la segunda respuesta en esta página está funcionando para mí. Vibra en un patrón y luego se detiene una vez que el patrón está terminado:

 // 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, eg '1' v.vibrate(pattern, 0); 
  • Obtener ancho de pantalla Android en inmersiones
  • Eliminar SMS en Android 1.5
  • Multiprocesamiento en Android
  • No se puede tomar la captura de pantalla en android utilizando robotium y método privado
  • Cómo formatear la fecha actual con Sufijo a Superscript?
  • Fire base no llama onCancelled si el tiempo de espera o no puede acceder al servidor
  • Q. Ubicación GPS de Android
  • ¿Por qué usar Enums en lugar de Constantes?
  • ¿Se trata de una consulta SQLite válida?
  • Patrones para crear una aplicación de chat con XMPP
  • Sqlite Database - ¿Cómo guardar la imagen tomada de la intención de la cámara, así como hashmap a sqlite para recuperar más tarde?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.