Bonjour,
je fais face depuis plusieurs semaines à un problème plutôt embêtant que je n'arrive pas à résoudre:
J'appel via un AlarmManager un BroadcastReceiver chargé de récupérer la date de dernière action utilisateur. Pour le teste j'ai simplement fait une boucle d'appel à la fonction donc je ne m'attarde pas la dessus.
Pour ce faire, j'utilise un shell en root (l'app ne tournera que sur un type précis de tablette qui est root à la sortie de l'usine)
new ProcessBuilder("su", "-c", "dumpsys power").start();
je récupère les streams et les traite pour récupérer l'info que je recherche:
1 2 3 4 5 6
| while ( (line = br.readLine()) != null) {
if(line.contains("mLastUserActivityTime=")){
line = line.substring(line.indexOf("(") + 1, line.indexOf("ms") - 1);
_last = Double.valueOf(line.trim());
}
} |
Et tout fonctionne très bien, les 3058 premières fois... (bon ok ça représente plus de 2 jours de fonctionnement mais j'ai besoin de le laisser tourner bien plus longtemps que cela)
Si je tue l'application à la 1000eme boucle et que je la relance elle bloquera à 2058.
De plus, lorsqu'elle est bloquée, elle bloque également d'autres application ROOT tel que ADB WIFI, je dois redémarrer la tablette pour pouvoir l'utiliser de nouveau.
Du coup j'ai 2 questions:
-Y a-t-il un autre moyen de récupérer cette valeur sachant que l'utilisateur n'utilise pas une application particulière mais celle qu'il veut?
-Si non, faut-il faire quelque chose de spécial lors de l'utilisation de ProcessBuilder pour libérer une ressource ou autre?
Voici le code complet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class StreamGobbler extends Thread{
InputStream is;
String type;
double _last;
StreamGobbler(InputStream is, String type){
this.is = is;
this.type = type;
}
public void run(){
try{
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null) {
if("INPUT".equals(type) && line.contains("mLastUserActivityTime=")){
line = line.substring(line.indexOf("(") + 1, line.indexOf("ms") - 1);
_last = Double.valueOf(line.trim());
}
if("ERROR".equals(type))
System.out.println(type + ">" + line);
}
} catch (IOException ioe){
ioe.printStackTrace();
}
}
} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public double getTime() {
Process p;
try {
p = new ProcessBuilder("su", "-c", "dumpsys power").start();
StreamGobbler gobIn = new StreamGobbler(p.getInputStream(), "INPUT");
gobIn.start();
StreamGobbler gobError = new StreamGobbler(p.getErrorStream(), "ERROR");
gobError.start();
if(p.waitFor()==0)
_last = gobIn._last;
System.out.println("Exit > "+_last/1000);
}catch (Exception ex){
ex.printStackTrace();
return _last;
}
return _last;
} |
Partager