Vous ne pouvez pas normal sur l'étagère du combiné, car il n'est pas possible pour gagner le SET_TIME autorisation. Cette autorisation a la protectionLevel de signatureOrSystem, donc il n'y a aucun moyen pour un marché d'application pour le changement global du système en temps (mais peut-être avec du noir vodoo de la magie, je ne sais pas encore).
Vous ne pouvez pas utiliser d'autres méthodes, car cela est impossible sur un Linux niveau, (voir la réponse ci-dessous) - c'est pourquoi tous les essais à l'aide de terminaux et SysExecs va échouer.
Si vous POUVEZ gagner de l'autorisation, soit parce que vous avez ancré votre téléphone ou de construit et la signature de votre propre plate-forme de l'image, lisez la suite.
Réponse Courte
Il est possible de faire et qui a été fait. Vous avez besoin android.permission.SET_TIME. Par la suite utiliser le AlarmManager via Context.getSystemService(Context.ALARM_SERVICE) et il s méthode setTime().
Extrait de réglage de 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 voulez changer le fuseau horaire, l'approche devrait être très similaire (voir android.permission.SET_TIME_ZONE et setTimeZone)
Réponse Longue
Comme il a été souligné dans plusieurs threads, uniquement le system utilisateur peut modifier l'heure du système. Ce n'est que la moitié de l'histoire. SystemClock.setCurrentTimeMillis() directement écrit à /dev/alarm qui est un fichier de périphérique détenue par system manque du monde des droits de l'écriture. Donc, en d'autres mots, seuls les processus en cours d'exécution comme system peut utiliser le SystemClock approche. De cette façon autorisations android n'a pas d'importance, il n'y a pas d'entité qui vérifie les autorisations appropriées.
C'est la façon dont l'interne préinstallé Paramètres de l'Application fonctionne. Il fonctionne sous la system compte d'utilisateur.
Pour tous les autres enfants, dans la ville il y a l'alarme manager. C'est un système de service en cours d'exécution dans le system_server processus sous - devinez quoi - system compte d'utilisateur. Il expose les cités setTime méthode, mais applique la SET_TIME autorisation et à son tour, appelle juste SystemClock.setCurrentTimeMillis en interne (qui succède à cause de l'utilisateur, l'alarme manager est en cours d'exécution comme).
~~~ Acclamations
Eh bien, j'ai ancré mon téléphone, mais je ne suis pas sûr de savoir comment convaincre mon application à exécuter suis.setTime() avec les autorisations appropriées. Savez-vous si il existe un moyen??
mais je veux obtenir le fuseau serveur MDT et je veux changer le fuseau horaire, comme GMT alors, comment c'est possibal
am.setTime(c.getTimeInMillis()); échec pour moi, sur le Nexus 6 avec les dernières mises à jour.
Selon ce fil utilisateur, les applications ne peuvent pas régler l'heure, quelles que soient les autorisations que nous lui donnons. Au lieu de cela, la meilleure approche est de permettre à l'utilisateur de régler l'heure manuellement. Nous allons utiliser:
Malheureusement, il n'existe aucun moyen de les relier directement au réglage de l'heure (ce qui permettrait d'économiser un plus, cliquez). En faisant usage de ellapsedRealtime, nous pouvons nous assurer que l'utilisateur définit le temps correctement.
J'ai testé sur android 6 et le format par défaut est "MMDDhhmm[[CC]AA][.ss]" option-s devrait être suivie par format au lieu de l'heure à laquelle vous voulez définir. Vous ne savez pas si c'est la version d'android différence.
Je n'ai pas vu celui-ci sur la liste de n'importe où, mais cela fonctionne pour moi. Mon appareil est enracinée et j'ai installé superuser, mais si l'utilisateur travaille sur la non-enracinée appareils, cela peut fonctionner. J'ai utilisé un AsyncTask et a appelé les suivantes:
protectedString doInBackground(String...params){Runtime.getRuntime().exec("su && date -s "+params[0]);}
Dans notre cas d'application, le sale solution a été:
Lorsque l'utilisateur est connecté à Internet, on a le Temps d'Internet (serveur NTP) et de comparer la différence (-) de l'appareil intérieur du temps (registederOffsetFromInternetTime). Nous l'enregistrer sur la config fichier d'enregistrement de l'utilisateur.
Nous utilisons le temps de le diviser + registederOffsetFromInternetTime à considérer la bonne heure de mise à jour de NOTRE application.
Tous GETHOUR processus de vérification de la différence entre l'heure réelle et l'heure des dernières comparission (avec le temps Internet). Si le temps de plus de 10 minutes, faire une nouvelle comparission de mettre à jour registederOffsetFromInternetTime et mantain précision.
Si l'utilisateur utilise l'Application sans Internet, nous ne pouvons utiliser la registederOffsetFromInternetTime stockées en tant que référence, et de l'utiliser. Seulement si l'utilisateur change l'heure locale de l'appareil en mode hors connexion et utiliser l'application, l'application permettra d'envisager des heures incorrectes. Mais, lorsque l'utilisateur revient à l'accès à internet nous avertir qu'il à propos de l'horloge changé , en demandant à resynchroniser tous ou desconsider mises à jour n'ont hors ligne avec la mauvaise heure.
grâce penquin. Dans quickshortcutmaker j'attrape le nom de la date/heure paramétrer l'activité exactement. donc, pour commencer le système de réglage de l'heure:
Vous ne pouvez pas normal sur l'étagère du combiné, car il n'est pas possible pour gagner le SET_TIME autorisation. Cette autorisation a la protectionLevel de
signatureOrSystem
, donc il n'y a aucun moyen pour un marché d'application pour le changement global du système en temps (mais peut-être avec du noir vodoo de la magie, je ne sais pas encore).Vous ne pouvez pas utiliser d'autres méthodes, car cela est impossible sur un Linux niveau, (voir la réponse ci-dessous) - c'est pourquoi tous les essais à l'aide de terminaux et SysExecs va échouer.
Si vous POUVEZ gagner de l'autorisation, soit parce que vous avez ancré votre téléphone ou de construit et la signature de votre propre plate-forme de l'image, lisez la suite.
Réponse Courte
Il est possible de faire et qui a été fait. Vous avez besoin
android.permission.SET_TIME
. Par la suite utiliser leAlarmManager
viaContext.getSystemService(Context.ALARM_SERVICE)
et il s méthodesetTime()
.Extrait de réglage de l'heure à 2010/1/1 12:00:00 à partir d'une Activité ou d'un Service:
Si vous voulez changer le fuseau horaire, l'approche devrait être très similaire (voir
android.permission.SET_TIME_ZONE
etsetTimeZone
)Réponse Longue
Comme il a été souligné dans plusieurs threads, uniquement le
system
utilisateur peut modifier l'heure du système. Ce n'est que la moitié de l'histoire.SystemClock.setCurrentTimeMillis()
directement écrit à/dev/alarm
qui est un fichier de périphérique détenue parsystem
manque du monde des droits de l'écriture. Donc, en d'autres mots, seuls les processus en cours d'exécution commesystem
peut utiliser leSystemClock
approche. De cette façon autorisations android n'a pas d'importance, il n'y a pas d'entité qui vérifie les autorisations appropriées.C'est la façon dont l'interne préinstallé Paramètres de l'Application fonctionne. Il fonctionne sous la
system
compte d'utilisateur.Pour tous les autres enfants, dans la ville il y a l'alarme manager. C'est un système de service en cours d'exécution dans le
system_server
processus sous - devinez quoi -system
compte d'utilisateur. Il expose les citéssetTime
méthode, mais applique laSET_TIME
autorisation et à son tour, appelle justeSystemClock.setCurrentTimeMillis
en interne (qui succède à cause de l'utilisateur, l'alarme manager est en cours d'exécution comme).~~~ Acclamations
Selon ce fil utilisateur, les applications ne peuvent pas régler l'heure, quelles que soient les autorisations que nous lui donnons. Au lieu de cela, la meilleure approche est de permettre à l'utilisateur de régler l'heure manuellement. Nous allons utiliser:
Malheureusement, il n'existe aucun moyen de les relier directement au réglage de l'heure (ce qui permettrait d'économiser un plus, cliquez). En faisant usage de ellapsedRealtime, nous pouvons nous assurer que l'utilisateur définit le temps correctement.
Une solution pour enracinée dispositifs pourraient être exécuter les commandes
Vous pouvez le faire par code avec la méthode suivante:
Il suffit d'appeler la méthode précédente comme ceci:
Je n'ai pas vu celui-ci sur la liste de n'importe où, mais cela fonctionne pour moi. Mon appareil est enracinée et j'ai installé superuser, mais si l'utilisateur travaille sur la non-enracinée appareils, cela peut fonctionner. J'ai utilisé un AsyncTask et a appelé les suivantes:
Dans notre cas d'application, le sale solution a été:
Lorsque l'utilisateur est connecté à Internet, on a le Temps d'Internet (serveur NTP) et de comparer la différence (-) de l'appareil intérieur du temps (registederOffsetFromInternetTime). Nous l'enregistrer sur la config fichier d'enregistrement de l'utilisateur.
Nous utilisons le temps de le diviser + registederOffsetFromInternetTime à considérer la bonne heure de mise à jour de NOTRE application.
Tous GETHOUR processus de vérification de la différence entre l'heure réelle et l'heure des dernières comparission (avec le temps Internet). Si le temps de plus de 10 minutes, faire une nouvelle comparission de mettre à jour registederOffsetFromInternetTime et mantain précision.
Si l'utilisateur utilise l'Application sans Internet, nous ne pouvons utiliser la registederOffsetFromInternetTime stockées en tant que référence, et de l'utiliser. Seulement si l'utilisateur change l'heure locale de l'appareil en mode hors connexion et utiliser l'application, l'application permettra d'envisager des heures incorrectes. Mais, lorsque l'utilisateur revient à l'accès à internet nous avertir qu'il à propos de l'horloge changé , en demandant à resynchroniser tous ou desconsider mises à jour n'ont hors ligne avec la mauvaise heure.
grâce penquin. Dans quickshortcutmaker j'attrape le nom de la date/heure paramétrer l'activité exactement. donc, pour commencer le système de réglage de l'heure:
`