Wie man Zeit und Datum des beweglichen Systems in Android einstellt?

Wenn Sie das Datum oder die Uhrzeit Ihres mobilen Systems in Ihrer Anwendung ändern möchten, wie gehen Sie vor?

Sie können nicht auf ein normales Handgerät zugreifen, da es nicht möglich ist, die SET_TIME-Berechtigung zu erhalten. Diese Berechtigung hat den protectionLevel von signatureOrSystem , also gibt es keine Möglichkeit für eine Markt-App, die globale Systemzeit zu ändern (aber vielleicht mit schwarzer Vodoo-Magie, die ich noch nicht kenne).

Sie können keine anderen Ansätze verwenden, da dies auf Linux-Ebene verhindert wird (siehe die lange Antwort unten) – deshalb werden alle Versuche mit Terminals und SysExecs fehlschlagen.

Wenn Sie die Berechtigung erhalten, entweder weil Sie Ihr Telefon gerootet oder Ihr eigenes Plattform-Image erstellt und signiert haben, lesen Sie weiter.

Kurze Antwort

Es ist möglich und wurde getan. Sie benötigen android.permission.SET_TIME . Verwenden Sie anschließend den AlarmManager über Context.getSystemService(Context.ALARM_SERVICE) und seine Methode setTime() .

Snippet für die Zeiteinstellung zu 2010/1/1 12:00:00 von einer Aktivität oder einem 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()); 

Wenn Sie die Zeitzone ändern möchten, sollte der Ansatz sehr ähnlich sein (siehe android.permission.SET_TIME_ZONE und setTimeZone )

Lange Antwort

Wie in mehreren Threads gezeigt wurde, kann nur der system die system ändern. Das ist nur die halbe Geschichte. SystemClock.setCurrentTimeMillis() schreibt direkt in /dev/alarm , eine Gerätedatei, die zu dem system , dem weltweit schreibbare Rechte fehlen. Mit anderen Worten, nur processe, die als system können den SystemClock Ansatz verwenden. Für diese Art und Weise spielen Android-Berechtigungen keine Rolle, es ist keine Instanz beteiligt, die die richtigen Berechtigungen überprüft.

Auf diese Weise funktioniert die interne vorinstallierte App “Einstellungen”. Es läuft nur unter dem system .

Für alle anderen Kinder in der Stadt gibt es den Alarmmanager. Es ist ein Systemdienst, der im system_server unter dem – system_server what – system . Es stellt die angegebene Methode setTime , erzwingt jedoch die SET_TIME und ruft intern nur SystemClock.setCurrentTimeMillis intern auf (was aufgrund des Benutzers, unter dem der Alarmmanager ausgeführt wird, erfolgreich ist).

~~~ Prost

Laut diesem Thread können Benutzer-Apps die Zeit nicht einstellen, unabhängig von den Berechtigungen, die wir ihnen geben. Stattdessen empfiehlt es sich , den Benutzer die Zeit manuell festlegen zu lassen . Wir werden verwenden:

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

Leider gibt es keine Möglichkeit, sie direkt mit der Zeiteinstellung zu verbinden (was sie einen weiteren Klick speichern würde). Mit Hilfe von ellapsedRealtime können wir sicherstellen, dass der Benutzer die Zeit richtig einstellt.

Eine Lösung für gerootete Geräte könnte die Ausführung der Befehle sein

  • su
  • Datum -s JJJJMMTT.HHMMSS

Ändern Sie das Datum am cmd

Sie können dies mit der folgenden Methode durch Code tun:

 private void changeSystemTime(String year,String month,String day,String hour,String minute,String second){ try { Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); String 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(); } } 

Rufen Sie einfach die vorherige Methode wie folgt auf:

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

Ich habe diesen hier nirgendwo auf der Liste gesehen, aber er funktioniert für mich. Mein Gerät ist rooted und ich habe Superuser installiert, aber wenn Superuser auf nicht gerooteten Geräten funktioniert, könnte dies funktionieren. Ich habe eine AsyncTask verwendet und folgendes aufgerufen:

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

In unserem Anwendungsfall war die schmutzige Problemumgehung:

Wenn der Benutzer mit dem Internet verbunden ist, erhalten wir die Internet-Zeit (NTP-Server) und vergleichen die Differenz (-) der internen Gerätezeit (registredOffsetFromInternetTime). Wir speichern es in der Konfigurationsdatei des Benutzers.

Wir verwenden die Zeit von devide + registeredOffsetFromInternetTime, um die korrekte aktualisierte Zeit für unsere Anwendung zu berücksichtigen.

Alle GETHOUR-processe überprüfen den Unterschied zwischen der tatsächlichen Uhrzeit und der Uhrzeit des letzten Vergleichs (mit der Internetzeit). Wenn die Zeit mehr als 10 Minuten beträgt, führen Sie einen neuen Vergleich durch, um registederOffsetFromInternetTime zu aktualisieren und die Genauigkeit zu erhalten.

Wenn der Benutzer die App ohne Internet verwendet, können wir nur die als Referenz gespeicherte registreteOffsetFromInternetTime verwenden und sie verwenden. Nur wenn der Benutzer die Stunde im lokalen Gerät ändert, wenn er offline ist und die App verwendet, berücksichtigt die App falsche Zeiten. Aber wenn der Benutzer zurück zum Internet Zugang kommt, warnen wir ihn über die veränderte Uhrzeit, um alle oder enttäuschenden Updates offline mit der falschen Stunde neu zu synchronisieren.

Danke, Penquin. In quickshortcutmaker erfasse ich genau den Namen der Datum / Uhrzeit-Aktivität. So starten Sie die Systemzeiteinstellung:

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

`