Comment définir l’heure et la date du système mobile dans Android?

Lorsque vous souhaitez modifier la date ou l’heure du système mobile dans votre application, comment vous y prenez-vous?

Vous ne pouvez pas utiliser un combiné standard, car il n’est pas possible d’obtenir l’autorisation SET_TIME. Cette autorisation a la protection Niveau de signatureOrSystem , donc il n’y a aucun moyen pour une application de marché de changer l’heure système globale (mais peut-être avec la magie du vodoo noir que je ne connais pas encore).

Vous ne pouvez pas utiliser d’autres approches car cela est empêché au niveau Linux, (voir la réponse longue ci-dessous) – c’est pourquoi tous les essais utilisant des terminaux et SysExecs vont échouer.

Si vous POUVEZ obtenir la permission soit parce que vous avez rooté votre téléphone ou créé et signé votre propre image de plate-forme, lisez la suite.

Réponse courte

C’est possible et a été fait. Vous avez besoin de android.permission.SET_TIME . Ensuite, utilisez le AlarmManager via Context.getSystemService(Context.ALARM_SERVICE) et sa méthode setTime() .

Extrait de code pour définir l’heure à 2010/1/1 12:00:00 à partir d’une activité ou d’un service:

 Calendar c = Calendar.getInstance(); c.set(2010, 1, 1, 12, 00, 00); AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); am.setTime(c.getTimeInMillis()); 

Si vous souhaitez modifier le fuseau horaire, l’approche devrait être très similaire (voir android.permission.SET_TIME_ZONE et setTimeZone )

Longue réponse

Comme cela a été souligné dans plusieurs threads, seul l’utilisateur du system peut modifier l’heure du système. Ce n’est que la moitié de l’histoire. SystemClock.setCurrentTimeMillis() écrit directement dans /dev/alarm qui est un fichier de périphérique appartenant à un system dépourvu de droits accessibles en écriture. En d’autres termes, seuls les processus exécutés en tant que system peuvent utiliser l’approche SystemClock . Pour cette raison, les permissions Android n’ont pas d’importance, il n’y a aucune entité impliquée qui vérifie les permissions appropriées.

Voici comment fonctionne l’application de parameters préinstallée interne. Il s’exécute juste sous le compte d’utilisateur du system .

Pour tous les autres enfants de la ville, il y a le responsable des alarmes. Il s’agit d’un service système exécuté dans le processus system_server sous – devinez quoi – compte d’utilisateur system . Il expose la méthode setTime mentionnée mais impose l’autorisation SET_TIME et appelle simplement SystemClock.setCurrentTimeMillis interne (ce qui est le cas à cause de l’utilisateur sous lequel le gestionnaire d’alarmes s’exécute).

~~~ A bientôt

Selon ce fil , les applications utilisateur ne peuvent pas définir l’heure, quelles que soient les permissions que nous leur accordons. Au lieu de cela, la meilleure approche consiste à demander à l’utilisateur de définir l’heure manuellement . Nous utiliserons:

 startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS)); 

Malheureusement, il n’y a aucun moyen de les relier directement au réglage de l’heure (ce qui leur permettrait d’économiser un clic de plus). En utilisant ellapsedRealtime , nous pouvons nous assurer que l’utilisateur définit l’heure correctement.

Une solution pour les périphériques rootés pourrait être d’exécuter les commandes

  • su
  • date -s AAAAMMJJ.HHMMSS

Changer la date sur cmd

Vous pouvez le faire par code avec la méthode suivante:

 private void changeSystemTime(Ssortingng year,Ssortingng month,Ssortingng day,Ssortingng hour,Ssortingng minute,Ssortingng second){ try { Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); Ssortingng command = "date -s "+year+month+day+"."+hour+minute+second+"\n"; Log.e("command",command); os.writeBytes(command); os.flush(); os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 

Il suffit d’appeler la méthode précédente comme ceci:

 changeSystemTime("2015","04","06","13","09","30"); 

Je n’ai pas vu celui-ci sur la liste n’importe où mais ça marche pour moi. Mon périphérique est rooté et j’ai un superutilisateur installé, mais si le superutilisateur fonctionne sur des périphériques non rootés, cela peut fonctionner. J’ai utilisé un AsyncTask et appelé le suivant:

 protected Ssortingng doInBackground(Ssortingng... params){ Runtime.getRuntime().exec("su && date -s " + params[0]);} 

Dans notre cas d’application, la solution de contournement était la suivante:

Lorsque l’utilisateur est connecté à Internet, nous obtenons l’heure Internet (serveur NTP) et comparons la différence (-) de l’heure interne de l’appareil (registederOffsetFromInternetTime). Nous l’enregistrons dans le fichier d’enregistrement de configuration de l’utilisateur.

Nous utilisons l’heure de devide + registederOffsetFromInternetTime pour prendre en compte l’heure correcte de la mise à jour de notre application.

Tous les processus GETHOUR vérifient la différence entre l’heure actuelle et l’heure de la dernière comparaison (avec l’heure Internet). Si le temps dépasse 10 minutes, effectuez une nouvelle comparaison pour mettre à jour le fichier registederOffsetFromInternetTime et conserver l’exactitude.

Si l’utilisateur utilise l’application sans Internet, nous ne pouvons utiliser que registederOffsetFromInternetTime stocké comme référence et l’utiliser. Si l’utilisateur modifie l’heure dans un périphérique local hors connexion et utilise l’application, l’application prendra en compte les heures incorrectes. Mais lorsque l’utilisateur revient à l’access à Internet, nous le prévenons du changement d’horloge, en lui demandant de resynchroniser tout ou partie des mises à jour hors ligne avec l’heure incorrecte.

merci penquin. Dans quickshortcutmaker, je saisis exactement le nom de l’activité de définition de la date / heure. pour commencer le réglage de l’heure système:

 Intent intent=new Intent(); intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.DateTimeSettingsSetupWizard")); startActivity(intent); 

`