省流demo下载:链接: demo下载
AndroidManifest.xml所需要用到的权限
<uses-permission
android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
日志打印部分代码
/**
* logcat 帮助类
*/
public class LogcatHelper {
@SuppressLint("StaticFieldLeak")
private static LogcatHelper INSTANCE = null;
private static String PATH_LOGCAT;
private LogDumper mLogDumper = null;
private final int mPId;
/**
* 初始化目录
*/
public void init() {
String fileName = "log";
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + fileName);
PATH_LOGCAT = file.getAbsolutePath();
if (!file.exists()) {
file.mkdirs();
}
}
public static LogcatHelper getInstance() {
if (INSTANCE == null) {
INSTANCE = new LogcatHelper();
}
return INSTANCE;
}
private LogcatHelper() {
init();
mPId = android.os.Process.myPid();
}
public void start() {
if (mLogDumper == null) {
mLogDumper = new LogDumper(String.valueOf(mPId), PATH_LOGCAT);
}
if (!mLogDumper.isStart) {
mLogDumper.start();
}
}
public void stop() {
if (mLogDumper != null) {
mLogDumper.isStart = false;
mLogDumper.stopLogs();
mLogDumper = null;
}
}
/**
* 日志写入txt进程
*/
private static class LogDumper extends Thread {
private Process logcatProc;
private BufferedReader mReader = null;
private boolean mRunning = true;
private boolean isStart = false;
private final String mPID;
private FileOutputStream out = null;
@SuppressLint("SimpleDateFormat")
private final SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("HH_mm_ss");
@SuppressLint("SimpleDateFormat")
private final SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
private File fileLog;
private File file1;
private FileInputStream fis;
private OutputStreamWriter writer;
public LogDumper(String pid, String dir) {
mPID = pid;
try {
file1 = new File(dir + File.separator + simpleDateFormat1.format(new Date()));
if (!file1.exists()) {
file1.mkdirs();
}
fileLog = new File(file1.getAbsolutePath() + File.separator + "logcat_" + simpleDateFormat2.format(new Date()) + ".log");
if (!fileLog.exists()) {
fileLog.createNewFile();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 开始
*/
@Override
public synchronized void start() {
mRunning = true;
isStart = true;
super.start();
}
/**
* 停止
*/
public void stopLogs() {
isStart = false;
mRunning = false;
}
@Override
public void run() {
try {
String cmd = "logcat";
logcatProc = Runtime.getRuntime().exec(cmd);
mReader = new BufferedReader(new InputStreamReader(logcatProc.getInputStream(), StandardCharsets.UTF_8), 1024);
fis = new FileInputStream(fileLog);
out = new FileOutputStream(fileLog, true);
writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
String line;
while (mRunning && (line = mReader.readLine()) != null) {
if (!mRunning) {
break;
}
if (line.length() == 0) {
continue;
}
if (writer != null) {
writer.write(line + "\n");
}
long s = fis.available();
//当文件大于10M时候,重新创建txt文件
if (s > 1024 * 1024 * 10) {
fis.close();
fileLog = new File(file1.getAbsolutePath() + File.separator + "logcat_" + simpleDateFormat2.format(new Date()) + ".log");
if (!fileLog.exists()) {
fileLog.createNewFile();
}
fis = new FileInputStream(fileLog);
writer.close();
out.close();
out = new FileOutputStream(fileLog, true);
writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (logcatProc != null) {
logcatProc.destroy();
logcatProc = null;
}
if (mReader != null) {
try {
mReader.close();
mReader = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
out = null;
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
activity部分代码
public class MainActivity extends AppCompatActivity {
private final int REQUEST_CODE = 200;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestPermissions();
findViewById(R.id.tv_startLog).setOnClickListener(view -> startLog());
}
/**
* 获取权限
*/
private void requestPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int checkSelfPermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (checkSelfPermission == PackageManager.PERMISSION_DENIED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
}
}
}
/**
* 开始打印
*/
public void startLog() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
startLogApi30();
}else{
LogcatHelper.getInstance().start();
}
}
/**
* 针对android 11获取读写权限
*/
@RequiresApi(api = Build.VERSION_CODES.R)
private void startLogApi30() {
boolean highPermission = Environment.isExternalStorageManager();
if (!highPermission) {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.fromParts("package", getPackageName(), null));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else {
LogcatHelper.getInstance().start();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE && permissions.length > 0 &&
permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE) && grantResults[0]
== PackageManager.PERMISSION_GRANTED) {
startLog();
}
}
}
有啥问题可以在评论区留言