Android - 获取Logcat中用户打印的Log数据

前言:

注意:本文展示的是获取到你自己打印的在Logcat中Log的内容,比如你打印了100个同一TAG的运行日志,这时候你可能就要用到获取到每一个Log的数据的东西

最近有个问题就是要获取到蓝牙打印的日志数据内容并发送到后台,日志信息基本上都是同一个类的,所以只需要监听Log的Tag名称就可以。

这个方法不用保存在本地什么的,百度上找的用不上

实现步骤

一、创建LogService类



public class LogService extends Service {
    private static final String TAG = "LogService";
    private LinkedList logList = new LinkedList();
    private final int MAX_LINE = 500;
    private Thread readLog;
    private boolean isAllowReadLog = true;

   

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //Utility.LOG_TAG 为自定义的logString,service会读取此log
        
        readLog = new Thread(new logReaderThread("你要拦截的TAG名称,TAG知道啥意思吧"));
        readLog.start();
        isAllowReadLog = true;
        return START_STICKY;
    }

    class logReaderThread implements Runnable {

        private final String filter;

        public logReaderThread(String filter) {
            this.filter = filter;
        }

        @Override
        public void run() {
            Process mLogcatProc = null;
            BufferedReader reader = null;
            try {
                mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", filter + " *:S"});
                reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));
                String line;

                while (isAllowReadLog) {
                    if ((line = reader.readLine()) != null) {
                        Message msg = new Message();
                        msg.obj = line;
                        handler.sendMessage(msg);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            //数据返回在这里 msg.obj.toString()
            buildLogLine(msg.obj.toString());
        }
    };

    private void buildLogLine(String line) {
        LogLine log = new LogLine();
        log.time = DateUtil.getTodayDateTime() + ": ";
        if (line.contains(")")) {
            line = line.substring(line.indexOf(")") + 1, line.length());
        }
        log.content = line;
        Log.e(TAG, line);
        publishmessageplus(mqttPubTopic, line);
        while (logList.size() > MAX_LINE) {
            logList.remove();
        }
    }


    @Override
    public void onDestroy() {
        isAllowReadLog = false;
        super.onDestroy();
    }
}

二、AndroidManifest.xml 中注册 LogService(已经自动注册了就不用重复步骤)

三、启用 在你需要开启的地方这样写

Intent startIntent = new Intent(this, LogService.class);
startService(startIntent);

四、补上LogLine类

public class LogLine {
    public String time;
    public String content;
    public int color;

}

你可能感兴趣的:(android,java,开发语言)