2016-04-24 4 views
1

Я использую logcat для регистрации сообщений в своем приложении для Android, и я хотел бы иметь доступ к этим сообщениям и показывать их в TextView в DialogFragment. Список сообщений очень несовместим и меняется каждый раз, когда я открываю и закрываю диалог. Он показывает полную историю один раз, а затем в следующий раз, когда он стирает, а иногда он показывает еще несколько сообщений. Есть ли что-нибудь, что я могу сделать, чтобы показать все сообщения (для запуска) каждый раз, когда я открываю диалог? Я запускаю процесс в неподходящее время или что-то в этом роде? Или должен ли буфер обрабатываться где-то еще? Благодарю.Как распечатать полную историю журнала в TextView на Android?

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_view_logs: 
      // View Logs MenuItem tapped 
      if (logsDialogFragment == null) { 
       logsDialogFragment = new LogsDialogFragment(); 
      } 
      logsDialogFragment.show(getFragmentManager(), "dialog"); 
      return true; 
     case R.id.action_exit: 
      // Exit MenuItem tapped 
      finish(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

public class LogsDialogFragment extends DialogFragment { 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Log.i(WifiDirectHandler.LOG_TAG, "Viewing Logs"); 
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()) 
     .setTitle(getString(R.string.title_logs)) 
     .setNegativeButton(getString(R.string.action_close), 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        dialog.dismiss(); 
       } 
      } 
     ); 

    LayoutInflater i = getActivity().getLayoutInflater(); 
    View rootView = i.inflate(R.layout.fragment_logs_dialog, null); 

    TextView logTextView = (TextView) rootView.findViewById(R.id.logTextView); 
    logTextView.setMovementMethod(new ScrollingMovementMethod()); 

    try { 
     Process process = Runtime.getRuntime().exec("logcat -d"); 
     BufferedReader bufferedReader = new BufferedReader(
       new InputStreamReader(process.getInputStream())); 

     StringBuilder log = new StringBuilder(); 
     String line; 
     while ((line = bufferedReader.readLine()) != null) { 
      if (line.contains(WifiDirectHandler.LOG_TAG)){ 
       // Removes log tag and PID from the log line 
       log.append(line.substring(line.indexOf(": ") + 2)).append("\n"); 
      } 
     } 
     logTextView.setText(log.toString()); 
    } catch (IOException e) { 
    } 

    dialogBuilder.setView(rootView); 
    return dialogBuilder.create(); 
} 
} 
+0

есть «logTextView», показывающий результат? –

+0

Да, но результаты разные, каждый раз, когда я открываю и закрываю диалог. – Brendan

+0

Результат не будет таким же, Его естественным, Ложная кошка показывает разные, см. Подробные, Вы можете не получить то же самое. –

ответ

0

Я закончил тем, что сохранил историю до переменной-члена и добавлял новые строки журнала каждый раз, когда открываю диалог.

public class LogsDialogFragment extends DialogFragment { 

    private StringBuilder log = new StringBuilder(); 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Sets the Layout for the UI 
     LayoutInflater i = getActivity().getLayoutInflater(); 
     View rootView = i.inflate(R.layout.fragment_logs_dialog, null); 

     TextView logTextView = (TextView) rootView.findViewById(R.id.logTextView); 
     logTextView.setMovementMethod(new ScrollingMovementMethod()); 

     try { 
      Process process = Runtime.getRuntime().exec("logcat -d"); 
      BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(process.getInputStream())); 

      StringBuilder log = new StringBuilder(); 
      String line; 
      while ((line = bufferedReader.readLine()) != null) { 
       if (line.contains(WifiDirectHandler.LOG_TAG)){ 
        // Removes log tag and PID from the log line 
        log.append(line.substring(line.indexOf(": ") + 2)).append("\n"); 
       } 
      } 

      this.log.append(log.toString().replace(this.log.toString(), "")); 
      logTextView.setText(this.log.toString()); 
     } catch (IOException e) { 
      Log.e("wifiDirectHandler", "Failure reading logcat"); 
     } 

     // Creates and returns the AlertDialog for the logs 
     AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()) 
      .setTitle(getString(R.string.title_logs)) 
      .setNegativeButton(getString(R.string.action_close), 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dialog.dismiss(); 
        } 
       } 
      ).setView(rootView); 
     return dialogBuilder.create(); 
    } 
} 
1
Please add permission in manifest for logcat <uses-permission android:name="android.permission.READ_LOGS" /> 
2

LogCat буфер сообщений не очень большой, так что старые сообщения просто стираются из LogCat, если вам нужен полный отчет - сохранить LogCat сообщений в файл на SDCard, а затем читать информацию от него. Этот метод будет сохранять все текущие сообщения в файл:

public static void saveLogcatToFile(Context context) { 
     String fileName = "yourlogname.log"; 
     File outputFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + 
       "/YourAppName", fileName); 
     try { 
      @SuppressWarnings("unused") 
      Process process = Runtime.getRuntime().exec("logcat -f "+outputFile.getAbsolutePath()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Код выше просто снимок журнала в определенный момент времени. Если вы хотите постоянно записывать журналы, используйте ведение журнала Java с помощью FileLogger и напишите на это.

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

  • Нет связанных вопросов^_^