Antes que nada, soy el desarrollador de ClockSync y sé algo sobre el tiempo de configuración en Android.
Me temo que la respuesta proporcionada por Violet Giraffe no es correcta. El problema es que la aplicación de usuario normal no puede obtener acceso al permiso SET_TIME. Este permiso solo puede ser utilizado por aplicaciones del sistema que están instaladas como parte de la ROM o están firmadas con la misma clave que la propia ROM (depende del proveedor). Una de las aplicaciones que está utilizando este enfoque es NTPc. Está firmado con la clave AOSP y se puede instalar en las ROM de Android basadas en AOSP, como CyanogenMod. Tenga en cuenta que Google ha prohibido las claves AOSP de Market recientemente y que el autor nunca podrá actualizar su aplicación. NTPc no se puede instalar en las ROM comunes que se usan en la mayoría de los teléfonos.
Si necesita los detalles, asegúrese de leer los comentarios sobre el famoso número 4581: Allow user apps to set the system time. Tenga en cuenta que la cuestión se Se rechaza la por Google con el siguiente comentario:
Hola, es por diseño que las aplicaciones no pueden cambiar el tiempo. Hay son muchos aspectos sutiles de la seguridad que pueden confiar en la hora actual, como caducidad del certificado, gestión de licencias, etc. No queremospermitir que las aplicaciones de terceros interrumpan globalmente el sistema de esta manera.
Cómo ajustar la hora en un dispositivo arraigada:
Lo que hace ClockSync para ajustar el tiempo está cambiando el permiso del dispositivo /dev/alarm
. Básicamente, ejecuta chmod 666 /dev/alarm
en el shell raíz.Una vez que este dispositivo tenga permisos de escritura para todos los usuarios, la llamada al SystemClock.
setCurrentTimeMillis(...) tendrá éxito. Algunas aplicaciones utilizan otro enfoque, ejecutan el comando date
en el shell raíz con los argumentos apropiados, sin embargo, es propenso a errores y es menos preciso porque el shell del superusuario y la ejecución del comando pueden tardar varios segundos. Un ejemplo de tal aplicación es Sytrant.
De forma predeterminada, ClockSync establece el permiso 666 solo si /dev/alarm
aún no se puede escribir. Esto ahorra CPU/batería porque la ejecución de su/Superuser.apk es relativamente costosa. Si le preocupa la seguridad, existe la opción Restore Permission que hará que el dispositivo de alarma otorgue permiso 664 después del tiempo de configuración.
Para facilitar el acceso al shell de la raíz de la aplicación, estoy usando mi propia clase de ayuda: ShellInterface. Otra opción es usar la biblioteca RootTools.
Aquí es el código de ejemplo basado en la clase ShellInterface:
public void setTime(long time) {
if (ShellInterface.isSuAvailable()) {
ShellInterface.runCommand("chmod 666 /dev/alarm");
SystemClock.setCurrentTimeMillis(time);
ShellInterface.runCommand("chmod 664 /dev/alarm");
}
}
Siéntase libre de visitar otras cuestiones Android relacionadas con el tiempo de fraguado:
Si necesita tiempo preciso en la aplicación sin necesidad de utilizar la raíz y el cambio de hora del sistema, usted puede tener sus propios temporizadores, por ejemplo basado en Joda Time. Puede obtener el tiempo de los servidores NTP que utilizan el cliente NTP de la biblioteca .
Tengo/dev/alarma configurado con 666 y estoy llamando setCurrentTimeMillis, pero siempre devuelve false – TimothyP
@TimothyP puede suceder en los últimos firmwares de Samsung con KNOX (SELinux) habilitados. La única forma de superarlo es usar la llamada de línea de comando 'date' como lo sugiere @Karan. El comando 'date' no admite milisegundos, por lo que le sugiero que alinee la llamada de comando con el segundo inicio utilizando el temporizador en función del tiempo atómico. – CrazyCoder
Veo, en este momento estoy teniendo el problema en una cubieboard, le preguntaré a los ingenieros si hicieron algo para bloquearlo. mientras tanto seguiré tu sugerencia thnx – TimothyP