2017-01-04 5 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

У меня была та же проблема. Вот как я это решил.

Сначала я создал TimerTask для записи/чтения непрерывного вывода в BufferReader либо logcat, либо getevent. TimerTask создает новый поток, который работает в фоновом режиме и не мешает или блокирует другие обработчики пользовательского интерфейса в классе обслуживания. Поэтому я считаю, что это безопаснее.

Затем я запустил TimerTask из класса Service в методе onCreate().

Одна вещь - мое устройство было укоренено, поэтому я начинаю с сессии «su». Я считаю, что сеанс «sh» также работает для не-root-устройств.

Класс обслуживания:

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); 
     } 
    } 
} 


} 
Смежные вопросы