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)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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();
        }
    }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
    }