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

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

如何获取呢?

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

//第一个是Logcat ,也就是我们想要获取的log日志
//第二个是 -s 也就是表示过滤的意思
//第三个就是 我们要过滤的类型 W表示warm ,我们也可以换成 D :debug, I:info,E:error等等
String[] running = new String[]{"logcat","-s","adb logcat *: W"};

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

Process exec = Runtime.getRuntime().exec(running);

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

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

首先:我们定义一个InputStream,

final InputStream is = exec.getInputStream

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

  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());
    }
  }

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

  <!-- 读取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视图文件:

<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里面初始化我们的类

private ListView listView;
  private Button btn;  

  listView = (ListView) findViewById(R.id.ListLog);
  btn = (Button) findViewById(R.id.BtnLog);

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

/**
   * 根据行读取内容
   * @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读写操作

if (file.isFile() && file.exists()) //这一行是判断是否有文件存在

然后我们用InputStreamReader读取我们SDCard中的文件;

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

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

最后我们返回List;

 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

<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中:

 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.log_list_item,Txt());
 listView.setAdapter(adapter);

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

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

最后、清空日志

如何清空日志呢?

其实非常简单

 /**
   * 删除Log文件
   * @param fileName 文件路径和名称
   */
  public static void delFile(String fileName){
    File file = new File(fileName);
    if(file.isFile()){
      file.delete();
    }
    file.exists();
  }

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android开发之在程序中时时获取logcat日志信息的方法(附demo源码下载)
  • logcat命令使用方法和查看android系统日志缓冲区内容的方法
(0)

相关推荐

  • Android开发之在程序中时时获取logcat日志信息的方法(附demo源码下载)

    本文实例讲述了Android开发之在程序中时时获取logcat日志信息的方法.分享给大家供大家参考,具体如下: 今天分享一个在软件开发中很实用的例子,也是这几天在通宵加班中我使用的一个小例子, 在程序中监听Log信息. 为什么说它实用?原因是Android的开发厂商各种修改之后手机和手机之间以后存在很多差异.比如说魅族M9手机 开发中如果项目中涉及到访问手机系统的地方,例如访问系统短信库,M9手机它会提示一个dialog框 让用户自己去选择 访问还是不访问.这样就给开发适配带来了巨大的麻烦.本来

  • logcat命令使用方法和查看android系统日志缓冲区内容的方法

    *注:可以用 adb logcat > 路径/文件名 来保存,此命令执行之时起的全部日志信息到一个文件里,ctrl + C 结束日志输出:后面不加 > 路径/文件名 的话,则在 stdout (终端窗口)中输出!例如:$ adb logcat -v long Checkin *:S > ~/桌面/log.txt 一.在 Java 与 C 语言中输出日志:1) Java 代码在程序中输出日志, 使用 android.util.Log 类的以下 5 个方法:   Log.v().Log.d(

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

    一.首先我们要获取Logcat中的日志 如何获取呢? 首先我们要先定义一个String[]数组,里面的代码是 //第一个是Logcat ,也就是我们想要获取的log日志 //第二个是 -s 也就是表示过滤的意思 //第三个就是 我们要过滤的类型 W表示warm ,我们也可以换成 D :debug, I:info,E:error等等 String[] running = new String[]{"logcat","-s","adb logcat *: W&

  • Android界面上拉下拉的回弹效果实例代码

    废话不多说,具体代码如下所示: public class MyScrollView extends ScrollView { private View childView; public MyScrollView(Context context) { super(context); } public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public MyScrollView(Co

  • Android 调用系统相机拍摄获取照片的两种方法实现实例

    Android 调用系统相机拍摄获取照片的两种方法实现实例 在我们Android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的照片.下面是我总结的两种方法获取拍摄之后的照片,一种是通过Bundle来获取压缩过的照片,一种是通过SD卡获取的原图. 下面是演示代码: 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http:

  • 在Android模拟器上模拟GPS功能总是null的解决方法

    我们都知道,在我们开发时需要在模拟器上模拟GPS,可在Location的时候总是null,上网查了一下,发现如下解决: 网上大侠的解决方案: 在模拟器上获取GPS信息时,使用Location loc = LocationManager.getLastKnownLocation("gps");来获取location信息,但是往往在调试中loc是null的,因为首先需要在模拟器中手动添加GPS信息,有两种手动添加方法 1.在eclipse下,windows-->open perspe

  • Android中TextView显示圆圈背景或设置圆角的方法

    前言 在我们学习android这么久,而且使用TextView那么长时间,我们一直没有用过给TextView添加背景,或者是给TextView添加添加边框,以及怎么样设置TextView的形状.今天在写代码的时候就用到了,怎么在java代码部分设置TextView的背景,和TextView的形状及边框. 方法如下: 接下来我们来看一下,怎么在Java代码部分怎么设置TextView的背景颜色,其实很简单的就一句话. tvTemp.setBackgroundColor(Color.parseCol

  • Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法

    先放个最终的效果图: 然后是代码: html文件: <body> <h1>TreeGrid</h1> <div> <a id="consle" href="#">consle</a> </div> <table id="test" title="Folder Browser" style="width:400px;height:

  • MySQL中按时间获取慢日志信息的方法

    今天处理一个case: 数据库异常,连接数突增. 想着分析一下慢日志,可是一看慢日志都好几G了,而且是短日志格式,找到那个时间点相对比较难.于是写了一个脚本从慢日志按时间提取点日志.脚本: https://github.com/wubx/mysql-binlog-statistic/blob/master/bin/cutlogbytime 使用方法: 复制代码 代码如下: cutlogbytime #用于从慢日志用截取一个时间段的日志方便分析 ./cutlogbytime /path/slowl

  • paramiko使用tail实时获取服务器的日志输出详解

    基本思路 现在有这么一个需求需要实现自动化:需要实时获取服务器cpu,gpu温度以及传感器信息上报情况,对高低温环境下对于设备运行状态的影响进行测试.基本思路为利用paramiko ssh到服务器上,起一个线程用tail -f命令实时获取日志输出,起另外一个线程用'cat /sys/class/thermal/thermal_zone0/temp'命令定时获取cpu,gpu温度. 代码 def get_report_info_perid(self, cmd, diff_time, thre_ti

  • 获取Android界面性能数据的快捷方法

    目录 探测 界面绘制性能 界面首次绘制完成时间 更快捷的获取activity的启动时间 获取应用冷启动 性能 探测 界面绘制性能 获取界面的绘制性能有很多种方法,比如说 Systrace 但是这种方法 有一个不太好的地方就是使用起来较为复杂, 有没有一种 谷歌官方推荐 的方便一点的方法 ,其实是有的,只需要一个函数 就可以获得layout的时间 非常适合于 我们平时开发中 测试页面性能. //调试界面性能时使用,可打印关键的layout耗时,使用完毕需删除 fun Activity.printP

随机推荐