在Android界面上显示和获取Logcat日志输出的方法

6
回复
551
查看
[复制链接]

314

主题

1001

帖子

689

安币

手工艺人

发表于 2018-3-27 11:42:39 | 显示全部楼层 |阅读模式

            

        一、首先我们要获取logcat中的日志

        如何获取呢?

        首先我们要先定义一个string[]数组,里面的代码是

[Java] 查看源文件 复制代码
//第一个是logcat ,也就是我们想要获取的log日志
//第二个是 -s 也就是表示过滤的意思
//第三个就是 我们要过滤的类型 w表示warm ,我们也可以换成 d :debug, i:info,e:error等等
string[] running = new string[]{"logcat","-s","adb logcat *: w"};

        当我们设置好之后,我们还需要一个process类,作用通俗来讲就是用java代码来进行adb命令行操作代码是:

[Java] 查看源文件 复制代码
process exec = runtime.getruntime().exec(running);

        通过以上的方法我们就可以获得和过滤logcat中的方法。

        二、接下来开始使用io流进行字符操作,把数据保存在android sdcard中

        首先:我们定义一个inputstream,

[Java] 查看源文件 复制代码
final inputstream is = exec.getinputstream

        接下来开启一个线程,线程中的方法就是通过io流先读取logcat中的数据,然后再把数据通过outputstream方法写入到sdcard中。

[Java] 查看源文件 复制代码
  new thread() {
        @override
        public void run() {
          fileoutputstream os = null;
          try {
            //新建一个路径信息
            os = new fileoutputstream("/sdcard/log/log.txt");
            int len = 0;
            byte[] buf = new byte[1024];
            while (-1 != (len = is.read(buf))) {
              os.write(buf, 0, len);
              os.flush();
            }
          } catch (exception e) {
            log.d("writelog",
                "read logcat process failed. message: "
                    + e.getmessage());
          } finally {
            if (null != os) {
              try {
                os.close();
                os = null;
              } catch (ioexception e) {
                // do nothing
              }
            }
          }
        }
      }.start();
    } catch (exception e) {
      log.d("writelog",
          "open logcat process failed. message: " + e.getmessage());
    }
  }

        当我们这个类写完之后,我们再把权限添加进去就可以了。

[Java] 查看源文件 复制代码
  <!-- 读取log权限 -->
  <uses-permission android:name="android.permission.read_logs" />
  <!-- 在sdcard中创建与删除文件权限 -->
  <uses-permission android:name="android.permission.mount_unmount_filesystems" />
  <!-- 往sdcard写入数据权限 -->
  <uses-permission android:name="android.permission.write_external_storage" />
  <!-- 从sdcard读出数据权限 -->
  <uses-permission android:name="android.permission.read_external_storage" />

        添加完权限,我们运行试试。

        


        然后我们再打开我们的sdcard中的文件目录:

        


        这样我们就已经获取到了logcat中的日志(可以和控制台的对比一下):

        


        由于我开启了两次所以打印出了两次的log.

        三、之后我们先创建页面,然后在按行读取txt文本中的内容

        首先我们开始编写xml视图文件:

[Java] 查看源文件 复制代码
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".mainactivity" >
  
  <linearlayout 
      android:layout_width="match_parent"
      android:layout_weight="7"
      android:orientation="vertical"
    >
    <listview 
      android:id="@+id/listlog"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      ></listview>
    
  </linearlayout>

  <linearlayout
    android:layout_width="match_parent"
    android:layout_weight="1"
    android:gravity="center"
    android:orientation="horizontal" >

    <button 
    android:layout_gravity="center"
      android:gravity="center"
      android:id="@+id/btnlog"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="清空日志"
      />
    
  </linearlayout>
</linearlayout>

        编写完成后,我们开始在mainactivity里面初始化我们的类

[Java] 查看源文件 复制代码
private listview listview;
  private button btn;  
    
  listview = (listview) findviewbyid(r.id.listlog);
  btn = (button) findviewbyid(r.id.btnlog);

        之后,我们开始编写我们的读取txt文件的方法

[Java] 查看源文件 复制代码
/** 
   * 根据行读取内容 
   * @return 
   */ 
  public list<string> txt() {  
    //将读出来的一行行数据使用list存储  
    string filepath = "/sdcard/log.txt";  
 
    list newlist=new arraylist<string>(); 
    try {  
      file file = new file(filepath);  
      int count = 0;//初始化 key值  
      if (file.isfile() && file.exists()) {//文件存在  
        inputstreamreader isr = new inputstreamreader(new fileinputstream(file));  
        bufferedreader br = new bufferedreader(isr);  
        string linetxt = null;  
        while ((linetxt = br.readline()) != null) { 
          if (!"".equals(linetxt)) {  
            string reds = linetxt.split("\\+")[0]; //java 正则表达式  
            newlist.add(count, reds); 
            count++;  
          }  
        }  
        isr.close();  
        br.close();  
      }else {  
        log.e("tag", "can not find file");
      }  
    } catch (exception e) {  
      e.printstacktrace();  
    }  
    return newlist;  
  }  

        我们看d的代码,其实也就是io读写操作

[Java] 查看源文件 复制代码
if (file.isfile() && file.exists()) //这一行是判断是否有文件存在

        然后我们用inputstreamreader读取我们sdcard中的文件;

        使用bufferedreader方法读取我们获取的字符流;

        最后我们用while循环和正则表达式来把每一行都给放入list中;

        最后我们返回list;

[Java] 查看源文件 复制代码
 inputstreamreader isr = new inputstreamreader(new fileinputstream(file));  
        bufferedreader br = new bufferedreader(isr);  
        string linetxt = null;  
        while ((linetxt = br.readline()) != null) { 
          if (!"".equals(linetxt)) {  
            string reds = linetxt.split("\\+")[0]; //java 正则表达式  
            newlist.add(count, reds); 
            count++;  
          }  
        }  

        还有一个xml视图文件,名称log_list_item.xml

[Java] 查看源文件 复制代码
<textview xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" 
   android:textcolor="#000000"
  android:gravity="left"
  android:paddingleft="20dp"
  android:textsize="20sp"
  android:singleline="true"
/>

        接下来就是把list放入listview中:

[Java] 查看源文件 复制代码
 arrayadapter<string> adapter = new arrayadapter<string>(this, r.layout.log_list_item,txt());
 listview.setadapter(adapter);

        好让我们运行一下看看效果:

        


        好了,我们的显示日志也已经成功了。接下来就是要可以清空日志;

        最后、清空日志

        如何清空日志呢?

        其实非常简单

[Java] 查看源文件 复制代码
 /**
   * 删除log文件
   * @param filename 文件路径和名称
   */
  public static void delfile(string filename){ 
    file file = new file(filename); 
    if(file.isfile()){ 
      file.delete(); 
    } 
    file.exists(); 
  } 

        我们只需要把路径传过去,进行判断,如果有就直接删除。

        然后我们对listview进行刷新就可以了。






        

350

主题

967

帖子

785

安币

手工艺人

发表于 2018-3-27 17:12:28 | 显示全部楼层
支持楼主,支持安卓巴士!

0

主题

9481

帖子

2471

安币

Android大神

Rank: 6Rank: 6

发表于 2018-3-28 00:17:56 | 显示全部楼层
支持,感谢,祝巴士越来越好~

0

主题

9390

帖子

2413

安币

Android大神

Rank: 6Rank: 6

发表于 2018-3-28 09:51:54 | 显示全部楼层
感谢分享,楼主V5~

325

主题

960

帖子

714

安币

手工艺人

发表于 2018-3-28 17:26:43 | 显示全部楼层
帮帮顶顶!!

446

主题

1082

帖子

1988

安币

手工艺人

发表于 2018-3-29 05:16:07 | 显示全部楼层
楼主威武,以后多发干货,多办活动~!

0

主题

9261

帖子

2903

安币

Android大神

Rank: 6Rank: 6

发表于 2018-3-29 18:35:17 | 显示全部楼层
感谢分享,安卓巴士有你更精彩:lol
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )