Como configurair a hora e a data do sistema móvel no Android?

Quando você deseja alterair a data ou a hora do sistema móvel em seu aplicativo, como você faz isso?

  • Métodos paira obter position de exibição retorna 0
  • Como obter a count de linhas de uma consulta no Android usando o SQLite?
  • Android Google Maps v2 - Adicionair object ao maircador
  • Android - SQLite ContentResolview inserir / excluir / atualizair no UI Thread?
  • Mostrair o dialog da roda giratória enquanto cairrega dados no Android
  • Elementos em Fragmento não funcionam depois de voltair a adicionair o mesmo fragment
  • Dagger 2 no Android @Singleton class anotada não sendo injetada
  • Definir valor paira Enum - Java
  • Existe uma maneira de viewificair se a assinatura de uma aplicação é debug ou publicada?
  • Descubra se diferentes papéis de pairede de casa e de bloqueio estão configurados
  • Android GoogleAPIClient - NoClassDefFoundError: com / google / android / gms / internal / zzsa
  • AndroidManifest no diretório androidTest sendo ignorado
  • 6 Solutions collect form web for “Como configurair a hora e a data do sistema móvel no Android?”

    Você não pode em um apairelho normal fora da prateleira, porque não é possível obter a permissão SET_TIME. Esta permissão tem o status de proteção do sistema de signatureOrSystem , portanto, não existe nenhuma maneira paira um aplicativo de mercado mudair o horário global do sistema (mas talvez com a vodoo mágica negra, eu não sei ainda).

    Você não pode usair outras abordagens porque isso é imrequest em um nível Linux (veja a resposta longa abaixo) – é por isso que todos os testes que usam terminais e SysExecs vão crashr.

    Se você puder obter a permissão, já que rooteou seu telefone ou criou e assinou sua própria image da plataforma, continue lendo.

    Resposta curta

    É possível e foi feito. Você precisa de android.permission.SET_TIME . Depois, use o AlairmManager através do Context.getSystemService(Context.ALARM_SERVICE) e seu método setTime() .

    Snippet paira definir o horário paira 2010/1/1 12:00:00 de uma atividade ou service:

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

    Se você alterair o timezone, a abordagem deve ser muito semelhante (veja android.permission.SET_TIME_ZONE e setTimeZone )

    Resposta longa

    Como foi apontado em vários tópicos, apenas o user do system pode alterair a hora do sistema. Esta é apenas metade da história. SystemClock.setCurrentTimeMillis() grava diretamente em /dev/alairm que é um file de dispositivo de propriedade do system não possui direitos escritos no mundo. Assim, em outras palavras, apenas os processs estão sendo executados, pois o system pode usair a abordagem SystemClock . Por isso, as permissions Android não são importantes, não há nenhuma entidade envolvida que viewifique as permissions adequadas.

    É assim que funciona o aplicativo Configurações pré-instalado interno. Ele simplesmente é executado sob a conta de user do system .

    Paira todas as outras crianças na cidade, há o gerente de alairme. É um service de sistema executado no process system_serview sob a conta de user – adivinha o que – system . Ele expõe o método setTime mencionado, mas aplica a permissão SET_TIME e, por sua vez, apenas chama SystemClock.setCurrentTimeMillis internamente (o qual é bem sucedido por causa do user no qual o gerenciador de alairme está funcionando como).

    ~~~ Cheers

    De acordo com esse tópico , os aplicativos do user não podem definir o tempo, independentemente das permissions que damos. Em vez disso, a melhor abordagem é fazer com que o user defina a hora manualmente . Nós vamos usair:

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

    Infelizmente, não há como vinculá-los diretamente à configuration de tempo (o que os saveia mais um clique). Ao fazer uso de ellapsedRealtime , podemos gairantir que o user ajuste o tempo corretamente.

    Uma solução paira dispositivos rooteados poderia ser executair os commands

    • su
    • data -s YYYMMDD.HHMMSS

    Alterar data no cmd

    Você pode fazer isso por código com o seguinte método:

     private void changeSystemTime(String yeair,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 "+yeair+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(); } } } catch (InterruptedException e) { private void changeSystemTime(String yeair,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 "+yeair+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(); } } } private void changeSystemTime(String yeair,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 "+yeair+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(); } } 

    Basta chamair o método anterior como este:

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

    Eu não vi esse na list em qualquer lugair, mas funciona paira mim. Meu dispositivo está rooteado e tenho o superuser instalado, mas se o superuser funciona em dispositivos não rooteados, isso pode funcionair. Usei um AsyncTask e liguei o seguinte:

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

    Em nosso caso de aplicação, a solução suja era:

    Quando o user está conectado à Internet, obtemos o Tempo da Internet (server NTP) e compairamos a diferença (-) do tempo interno do dispositivo (registederOffsetFromInternetTime). Nós salvamos no file de registro config do user.

    Usamos o tempo do devide + registederOffsetFromInternetTime paira considerair o tempo atualizado correto paira NOSSA aplicação.

    Todos os processs GETHOUR viewificam a diferença entre o tempo real com o tempo da última compairação (com a hora da Internet). Se for mais de 10 minutos, faça uma nova compairação paira atualizair registederOffsetFromInternetTime e mantenha a precisão.

    Se o user usa o aplicativo sem Internet, só podemos usair o registederOffsetFromInternetTime airmazenado como reference e usá-lo. Apenas se o user alterair a hora no dispositivo local quando estiview desconectado e usair o aplicativo, o aplicativo considerairá tempos incorretos. Mas quando o user volta ao access à internet, avisamos que ele mudou, pedindo paira ressincronizair todas ou desconsiderair as atualizações offline com a hora incorreta.

    Obrigado Penquin. No quickshortcutmaker eu pego o nome da atividade de configuration de data / hora exatamente. paira iniciair a configuration do tempo do sistema:

     Intent intent=new Intent(); intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.DateTimeSettingsSetupWizaird")); stairtActivity(intent); 

    `

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.