2012-01-05 13 views
22

Actualmente estoy tratando de configurar el tiempo del sistema Android en el software. Sí, sé que mucha gente lo intentó, y falló como lo hago ahora. :-)Configurar la hora del sistema del teléfono ROOTED

Pero también sé que es posible establecer la hora del sistema Android en los teléfonos ROOTED. He probado una aplicación llamada ClockSync que sí lo hace.

Así que lo que quiero es averiguar cómo configurar la hora del sistema en los dispositivos ROOTED. Por favor no digas que no es posible. :-)

Lo he intentado hasta ahora es establecer los permisos siguientes:

<uses-permission android:name="android.permission.SET_TIME_ZONE"/> 
<uses-permission android:name="android.permission.SET_TIME"/> 

Y luego, en mi código:

AlarmManager a = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
long current_time_millies = System.currentTimeMillis(); 
try { 
    a.setTime((long)current_time_millies+10000); 
} catch (Exception e) { 
// Why is this exception thrown? 
} 

pero siempre me sale el siguiente excepción:

java.lang.SecurityException: setTime: Ni el usuario 10054 ni el proceso actual tiene android.permission.SET_TIME.

Lo estoy probando en el mismo dispositivo donde ClockSync funciona perfectamente. Entonces, ¿qué estoy haciendo mal? O mejor: ¿Puedes proporcionar un código probado que funcione?

Respuesta

51

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 .

+0

Tengo/dev/alarma configurado con 666 y estoy llamando setCurrentTimeMillis, pero siempre devuelve false – TimothyP

+1

@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

+0

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

9

puede establecer la fecha y la hora del sistema en el dispositivo arraigada como esta

public void setDate() 
    { 
     try { 
      Process process = Runtime.getRuntime().exec("su"); 
     DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
      os.writeBytes("date -s 20120419.024012; \n"); 
     } catch (Exception e) { 
      Log.d(TAG,"error=="+e.toString()); 
      e.printStackTrace(); 
     } 
    } 
+1

Es una alternativa pobre ya que invocará el shell cada vez que necesite configurar el reloj, el comando de la fecha tomará algún tiempo para ejecutarse, por lo tanto, menos precisión, también el comando de fecha en algunos dispositivos usa un formato diferente y no funcionará. – CrazyCoder

+2

gracias amigo su trabajo con dispositivo rooteado –

+0

buena respuesta. ¡Gracias! – breceivemail

Cuestiones relacionadas