2017-01-04 7 views
1

私は起動するアンドロイドプロセスを持っています。それはgeteventコマンドです。これは(コンソールで実行されたとき)連続したイベントの発生を与えます。私はAndroidアプリ内でこれらを収集したいと思います。これを行う私の現在の方法は効果的に "ワンオフ"プロセス出力を収集しますが、geteventメソッドからの連続した結果が発生したときにその結果を格納する方法を見つけることはできません。Androidはプロセス出力を連続的に取得します

私の現在のコードは次のとおりです。これは "ls"のようなものではなく、 "getevent"のような連続ストリームでは機能しません。

try { 
      Process chmod = Runtime.getRuntime().exec("getevent -lt /dev/input/event1"); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(chmod.getInputStream())); 
      int read; 
      char[] buffer = new char[4096]; 
      StringBuffer output = new StringBuffer(); 
      while ((read = reader.read(buffer)) > 0) { 
       output.append(buffer, 0, read); 
      } 
      reader.close(); 
      chmod.waitFor(); 
      String outputString = output.toString(); 
      Log.d("output", outputString); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } catch (InterruptedException e) { 
      throw new RuntimeException(e); 
     } 

答えて

1

私は同じ問題がありました。ここで私はそれを解決した方法です。

最初に、logcatまたはgeteventのBufferReaderで連続出力をログ/読み込みするためのTimerTaskを作成しました。 TimerTaskはバックグラウンドで実行される新しいスレッドを作成し、サービスクラスの他のUIハンドラを妨害またはブロックしません。だから私はそれがもっと安全だと信じています。

次に、onCreate()メソッドでTimerTaskをサービスクラスから開始しました。

私のデバイスは根っからのものなので、私は 'su'セッションから始めます。私は 'sh'セッションは非ルートデバイスでも動作すると信じています。

サービスクラス:

public class ServiceClassPhone extends Service { 
.... 

private GetEventRecorder getEventRecorder; 

@Override 
public void onCreate() { 

.... 

getEventRecorder= new GetEventRecorder(); 
getEventRecorder.start(); 
// (if there is any) postDelay other UI handlers in service 
} 

そしてGetEventRecorderクラス:

public class GetEventRecorder { 


.... 
private static Logger mLogger = new Logger(); 

private GetEventRecorder mRecorder = null; 
Timer timer; 

// active su session 
private Process mProcess; 
// Byte Writer 
private OutputStream mStdIn; 
private DataOutputStream outputStream; 
private BufferedReader br; 


{ 
    try { 
     mProcess = Runtime.getRuntime().exec("su"); 

     outputStream = new DataOutputStream(mProcess.getOutputStream()); 
     String comm1 = "getevent -l"; 
     String comm2 = "logcat -c"; 
     String close = "^C"; 
     String newLine= "\n"; 

     outputStream.writeBytes(comm1); 
     outputStream.writeBytes(newLine); 


    } catch (IOException e) { 
     Log.d(TAG, "Could not spawn su process"); 
     e.printStackTrace(); 
    } 
} 


public void start() { 

     try { 

      timer = new Timer(); 
      timer.scheduleAtFixedRate(new GetEventRecorder.RecorderTask(), 0, 1000); 
     } catch (Exception e) { 
      Log.d(TAG, "Exception: " + e); 
     } 

} 

public void stop() { 
    if (mRecorder != null) { 
     mRecorder.stop(); 
     mRecorder = null; 
     timer.cancel(); 
    } 
} 



public void logGetEventData(){ 
    .... 

} 

} 


    private class RecorderTask extends TimerTask { 


    public RecorderTask() {} 


    @Override 
    public void run() { 

     try { 

      String comm1 = "getevent -l"; 
      String comm2 = "logcat -c"; 
      String close = "^C"; 
      byte[] newLine = "\n".getBytes(); 

      outputStream.writeBytes(close); 
      outputStream.flush(); 


      br = new BufferedReader(new InputStreamReader(mProcess.getInputStream())); 
      boolean cont=true; 
      String line; 
      Log.d(TAG,"geteventLogs BufferedReader for continuous getevent reading... "); 
      if (br!=null) { 
       Log.d(TAG,"geteventLogs BufferedReader is not null checking for readiness... "); 
       if (br.ready()) { 
        Log.d(TAG, "BufferedReader for getevent is not null and ready"); 


        String separator = System.getProperty("line.separator"); 
        while ((line = br.readLine()) != null && line.contains("event0:") 
          && !line.contains("BufferedReader")) { 
          ... 
          logGetEventData(); 

     }catch (Exception e) { 
      if (DBG) Log.d(TAG, "getevent recorder error: " + e); 
     } 
    } 
} 


} 
関連する問題