|
可以参考我这个:
<火山程序 类型 = "通常" 版本 = 1 />
包 com.log.app
类 启动类 <公开 基础类 = 窗口 注释 = "" 注释 = "声明读取权限" "//@安卓.附加清单" = 常用窗口附加清单.安卓5无标题白色窗口 @安卓.权限需求 = 安卓权限.读系统日志
@java.导入 = "java.io.BufferedReader\n java.io.InputStreamReader\n java.util.ArrayList">
{
变量 编辑框_日志输出 <类型 = 编辑框 隐藏值属性 = "0"
@安卓.窗口.布局 = "layout_weight = 90\np_layout_height_type = p_specified\np_layout_height_value = 0\np_layout_width_type = match_parent"
单行模式 = 假>
变量 按钮_开始获取系统日志 <类型 = 按钮 隐藏值属性 = "0"
@安卓.窗口.布局 = "ctrl_order = 1\nlayout_weight = 10\np_horz_align = center_horizontal\np_layout_height_type = p_specified\np_layout_height_value = 0\np_layout_width_type = match_parent\np_vert_align = center_vertical\ntext = 开始获取系统日志">
变量 ""
变量 成员变量_获取日志线程对象 <类型 = 线程类>
方法 线程类_线程启动 <接收事件 类型 = 整数 注释 = "线程已经启动事件" 注释 = "注意: 此事件的处理方代码将在多线程环境下执行,必须处理好多线程冲突问题.">
参数 来源对象 <类型 = 线程类 注释 = "提供事件产生的具体来源对象">
参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
参数 用户对象1 <类型 = 对象类 注释 = "提供调用启动方法时所提供的第1个用户对象">
参数 用户对象2 <类型 = 对象类 注释 = "提供调用启动方法时所提供的第2个用户对象">
{
如果 (来源对象 == 成员变量_获取日志线程对象)
{
调试输出 ("线程启动")
判断循环 (真)
{
@ try
@ {
@ ArrayList<String> cmdLine=new ArrayList<String>(); //设置命令 logcat -d 读取日志
@ cmdLine.add("logcat");
@ cmdLine.add("-d");
@
@ ArrayList<String> clearLog=new ArrayList<String>(); //设置命令 logcat -c 清除日志
@ clearLog.add("logcat");
@ clearLog.add("-c");
@
@ Process process=Runtime.getRuntime().exec(cmdLine.toArray(new String[cmdLine.size()])); //捕获日志
@ BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream())); //将捕获内容转换为BufferedReader
@
@ String str=null;
@ while((str=bufferedReader.readLine())!=null) //开始读取日志,每次读取一行
@ {
@ Runtime.getRuntime().exec(clearLog.toArray(new String[clearLog.size()])); //清理日志....这里至关重要,不清理的话,任何操作都将产生新的日志,代码进入死循环,直到bufferreader满
@ //System.out.println(str); //输出,在logcat中查看效果,也可以是其他操作,比如发送给服务器..
// 内容显示到编辑框中,不过这种写法在安卓中是不推荐的!
变量 日志内容 <类型 = 文本型>
@ @<日志内容> = str;
本对象.编辑框_日志输出.添加内容行 (日志内容)
@ }
@ if(str==null)
@ {
@ //System.out.println("-- is null --");
调试输出 ("-- is null --")
@ }
@ }
@ catch(Exception e)
@ {
@ e.printStackTrace();
@ }
@
}
}
返回 (0)
}
方法 按钮_被单击 <接收事件 类型 = 整数 注释 = "用户在组件上单击事件" 注释 = "注意:"
注释 = " 1. \"按钮\"类别及\"图片按钮\"组件会自动初始设置\"支持单击\"属性为真,不需要单独设置;"
注释 = " 2. 除开上述类别组件外,必须将组件的\"支持单击\"属性设置为真才会发送本事件.">
参数 来源对象 <类型 = 按钮 注释 = "提供事件产生的具体来源对象">
参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
{
如果 (来源对象 == 按钮_开始获取系统日志)
{
调试输出 ("%b", 成员变量_获取日志线程对象.启动 (, ))
}
返回 (0)
}
}
|
|