如何在 Android 的 TextView 中打印完整的 logcat 历史记录?
How can I print the full logcat history in a TextView in Android?
我正在使用 logcat 在我的 Android 应用程序中记录消息,我希望能够访问这些消息并在 DialogFragment 的 TextView 中显示它们。消息列表非常不一致,每次打开和关闭对话框时都会发生变化。它会显示一次完整的历史记录,然后在下次擦除时显示,有时还会显示更多消息。每次打开对话框时,我可以做些什么来显示所有消息(对于 运行)?我 运行 是不是在错误的时间启动了流程?或者缓冲区应该在其他地方处理吗?谢谢。
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();
}
}
Please add permission in manifest for logcat <uses-permission android:name="android.permission.READ_LOGS" />
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 的日志记录并写入。
我最终将历史保存到一个成员变量中,并且每次打开对话框时只附加新的日志行。
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();
}
}
我正在使用 logcat 在我的 Android 应用程序中记录消息,我希望能够访问这些消息并在 DialogFragment 的 TextView 中显示它们。消息列表非常不一致,每次打开和关闭对话框时都会发生变化。它会显示一次完整的历史记录,然后在下次擦除时显示,有时还会显示更多消息。每次打开对话框时,我可以做些什么来显示所有消息(对于 运行)?我 运行 是不是在错误的时间启动了流程?或者缓冲区应该在其他地方处理吗?谢谢。
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();
}
}
Please add permission in manifest for logcat <uses-permission android:name="android.permission.READ_LOGS" />
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 的日志记录并写入。
我最终将历史保存到一个成员变量中,并且每次打开对话框时只附加新的日志行。
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();
}
}