以下是一个将logcat保存到文件并限制文件大小的示例代码:
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private static final int WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 1;
private static final int MAX_LOG_FILE_SIZE = 1024 * 1024; // 1MB
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 检查写入外部存储的权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
} else {
// 已经有权限,开始保存logcat到文件
saveLogcatToFile();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予,开始保存logcat到文件
saveLogcatToFile();
} else {
// 权限被拒绝
Log.e("Permission Denied", "WRITE_EXTERNAL_STORAGE permission denied");
}
}
}
private void saveLogcatToFile() {
// 创建一个log文件
File logFile = getLogFile();
// 清除文件内容,以便重新开始
clearLogFile(logFile);
// 启动一个新的线程保存logcat到文件
new Thread(new Runnable() {
@Override
public void run() {
try {
// 创建logcat进程并将输出写入文件
Process process = Runtime.getRuntime().exec("logcat -d");
BufferedWriter writer = new BufferedWriter(new FileWriter(logFile));
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
// 将logcat输出写入文件
writer.write(line);
writer.newLine();
}
writer.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private File getLogFile() {
// 创建一个以当前时间命名的log文件
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String logFileName = "logcat_" + timeStamp + ".txt";
// 获取外部存储的根目录
File rootDir = Environment.getExternalStorageDirectory();
// 创建一个子目录用于存储log文件
File logDir = new File(rootDir, "logcat");
if (!logDir.exists()) {
logDir.mkdirs();
}
// 创建log文件
File logFile = new File(logDir, logFileName);
return logFile;
}
private void clearLogFile(File logFile) {
// 检查log文件是否存在并检查其大小
if (logFile.exists() && logFile.length() > MAX_LOG_FILE_SIZE) {
// 如果文件大小超过限制,删除文件以便重新开始
logFile.delete();
}
}
}
此代码示例在Android应用程序中使用了动态权限请求,因此在代码中包含了权限请求的逻辑。在onCreate()
方法中,首先检查WRITE_EXTERNAL_STORAGE
权限是否已经被授予。如果没有被授予,会请求该权限。如果权限已经被授予,会调用saveLogcatToFile()
方法开始保存logcat到文件。
saveLogcatToFile()
方法会创建一个log文件,并清除文件内容(如果文件存在且大小超过限制)。然后,它会启动一个新的线程,使用Runtime.getRuntime().exec()
方法执行logcat命令,并将输出写入文件。这个过程在后台线程中进行,以免阻塞主线程。
`