该类提供了若干静态方法
Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);
分别对应 Verbose, Debug, Info, Warning,Error.
tag是一个标识,可以是任意字符串,通常可以使用类名+方法名, 主要是用来在查看日志时提供一个筛选条件.
程序运行后 并不会在 ide的控制台内输出任何信息.
如果要后查看日志 请使用
adb logcat
关于adb的更多信息请查看官方网站.
当执行 adb logcat 后会以tail方式实时显示出所有的日志信息.
这时候我们通常需要对信息进行过滤,来显示我们需要的信息, 这时候我们指定的 tag就派上了用场.
adb logcat -s MyAndroid:I
这时将只显示tag为MyAndroid,级别为I或级别高于I(Warning,Error)的日志信息.
示例代码如下:
- package com.zijun;
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.View;
- public class MyAndroid extends Activity {
- protected static final String ACTIVITY_TAG="MyAndroid";
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(new MyView(this));
- }
- public class MyView extends View {
- public MyView(Context c) {
- super(c);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- }
- @Override
- public boolean onMotionEvent(MotionEvent event) {
- Log.i(MyAndroid.ACTIVITY_TAG, "=============================");
- Log.d(MyAndroid.ACTIVITY_TAG, "Haha , this is a DEBUG of MyAndroid. ");
- Log.i(MyAndroid.ACTIVITY_TAG, "Haha , this is a INFO of MyAndroid. ");
- Log.w(MyAndroid.ACTIVITY_TAG, "Haha , this is a WARNING of MyAndroid. ");
- return true;
- }
- }
- }
以上程序运行后, 在命令行执行 adb logcat -s MyAndroid:I
然后在手机模拟器的屏幕上 点击 拖动鼠标 就能看到相应的日志信息.
logcat是Android中一个命令行工具,可以用于得到程序的log信息。
logcat使用方法如下所示:
logcat [options] [filterspecs]
logcat的选项包括:
-s 设置过滤器,例如指定 '*:s'
-f <filename> 输出到文件,默认情况是标准输出。
-r [<kbytes>] Rotate log every kbytes. (16 if unspecified). Requires -f
-n <count> Sets max number of rotated logs to <count>, default 4
-v <format> 设置log的打印格式, <format> 是下面的一种:
brief process tag thread raw time threadtime long
-c 清除所有log并退出
-d 得到所有log并退出 (不阻塞)
-g 得到环形缓冲区的大小并退出
-b <buffer> 请求不同的环形缓冲区 ('main' (默认), 'radio', 'events')
-B 输出log到二进制中。
过滤器的格式是一个这样的串:
<tag>[:priority]
其中 <tag> 表示log的component, tag (或者使用 * 表示所有) , priority 如下所示:
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal
S Silent
事实上logcat的功能是由Android的类android.util.Log决定的,在程序中log的使用方法如下所示:
Log.v() -------------------- VERBOSE
Log.d() -------------------- DEBUG
Log.i() -------------------- INFO
Log.w() -------------------- WARN
Log.e() -------------------- ERROR
以上log的级别依次升高,DEBUG信息应当只存在于开发中,INFO, WARN,ERROR这三种log将出现在发布版本中。
对于JAVA类,可以声明一个字符串常量TAG,Logcat可以根据他来区分不同的log,例如在计算器(Calculator)的类中,定义如下所示:
public class Calculator extends Activity {
/* ...... */
private static final String LOG_TAG = "Calculator";
private static final boolean DEBUG = false;
private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
/* ...... */
由此,所有在Calculator中使用的log,均以"Calculator"为开头。
例如使用方法如下所示:
# logcat &
< 得到一个log片段 >
W/KeyCharacterMap( 130): No keyboard for id 0
W/KeyCharacterMap( 130): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
I/ActivityManager( 52): Displayed activity com.android.contacts/.DialtactsContactsEntryActivity: 983 ms
I/ARMAssembler( 52): generated scanline__00000077:03545404_00000A04_00000000 [ 29 ipp] (51 ins) at [0x25c978:0x25ca44] in 1764174 ns
I/ARMAssembler( 52): generated scanline__00000077:03515104_00000001_00000000 [ 46 ipp] (65 ins) at [0x25d1c8:0x25d2cc] in 776789 ns
D/dalvikvm( 130): GC freed 834 objects / 81760 bytes in 63ms
D/dalvikvm( 52): GC freed 10588 objects / 425776 bytes in 94ms
其中W/I/D表示log的级别,“dalvikvm”“ARMAssembler”等是不同组件(component)的名称,后面括号里面的数字表示了发出log的进程号。
使用技巧:
1.使用logcat &在后台运行
2.使用-d得到所有log
3.使用-f或者重定向(>和>>)输出到文件
4.使用-s设置过滤器,得到想要的log。
当然,最重要的还是在程序中加入恰当的log.
本文将讲述一种在android手机之间传输照片的方法。照片来源于手机摄像头的快照,传输的途径是通过xmpp协议。
技术原理
实现照片传输的方式很简单,主要涉及到以下流程:
发送端:
a.绑定本机到一个jabber session。
b.从摄像头获取快照,然后转化成bitmap图片,进而转化成png压缩格式。
c.使用base64,获取该png图片数据的文本形式.
d.通过IXmppSession的sendDataMessage方法,向接收对象的JID发送一个Intent.该intent的extra bundle 中置入png图片的文本载体。该Intent的action假定为SNAPSHOT_XMPP.
接收端:
a.绑定本机到另一个jabber session。
b.在AndroidManifest.xml中注册一个receiver,接收action为SNAPSHOT_XMPP的intent。
c.在该receiver中使用NotificationManager.notifyWithText方法发送一个通知,同时把receiver所接收到的intent的bundle内容(包含照片),拷贝到该通知的clickIntent的bundle中。
d.在该通知所绑定的clickIntent所激活的Activity中,从intent中获取照片的base64编码,再解码成Bitmap,显示。同时取消该通知。
之所以把图片转化文本,进行传输,是因为IXmppSession的sendDataMessage方法所使用的Bundle,目前只能夹带文本数据。
工程下载
点击这里,获取完整的eclipse android工程,名为camera_xmpp.
如何运行
1.在eclipse中运行camera_xmpp.系统将启动模拟器5555
2.将模拟器5555绑定到gmail1.
3.使用adb shell启动模拟器5557。
4.在5557上安装camera_xmpp的apk。
5.将模拟器5557绑定到gmail2.
这5步的操作步骤都可以在文1中找到,其中第4步比较麻烦,涉及到在第2个模拟器中安装apk应用的问题。我常常失败,后来我找到了一种很简单而又很稳妥的解决办法。新的步骤如下:
1.在eclipse中运行camera_xmpp.系统将启动模拟器5555
2.将模拟器5555绑定到gmail1.
3.拷贝C:\Documents and Settings\chenwf\Local Settings\Application Data\Android\userdata.img到c:\userdata2.img。你的环境可能需要酌情修改。
4.在cmd窗口执行以下指令:
emulator -skin QVGA-L -data C:\userdata2.img
系统将启动模拟器5557,而且因为用户数据和模拟器5555一样,自然就安装了5555的所有应用。
5.将模拟器5557绑定到gmail2.
6.让5555停留在桌面界面。让5557运行截屏传输应用。
7.在5557中传送屏幕截屏到5555所绑定的gmail1.
8.稍后,5555的通知就出现了(左上角).
9.在5555中按上键,通知icon获得焦点。
10.在5555中点击通知icon,显示收到的来自5557的截屏。
题外话
我曾试着在android平台实现远程设备进行实时视频,音频传输,可是目前wifi api还未公布,而xmpp又开不了socket连接,好像还没有办法,不知道大家有没有办法。
作者信息
Jagie,移动开发爱好者,可以通过chen_cwf@163.com与他联系
|
C:\Documents and Settings\Administrator>cd D:\andriod\tools C:\Documents and Settings\Administrator>d: D:\android\tools>adb install c:\NetScramble_1.1.apk |
回到Android模拟器的界面,我本来以为可以看到刚刚安装的APK程序图标,结果,却根本没有...后来研究了一下,发现这根APK包自身有关。使用自己编写的HelloAndroid安装,图标就可以显示在桌面上,而NetScramble_1.1.apk安装后却显示不出来。具体原因是来自于AndroidManifest.xml文件的内容。
| <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" </manifest> |
xml文件中,红色一行是表示这个apk属于哪个归类里,如果不正确的填写这个信息,Launcher将不会将其显示在桌面上,因为它会认为这个应用部署以自己的归类。
那么,是不是我们就无法执行缺失了category的apk了呢?
后来,在一个老外的blog上,查到了方法:在shell内使用am来加载android应用
| usage: am [start|instrument] |
比如启动一个manifest为如下内容的apk
| <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" </manifest> |
使用的指令为:
| am start -n net.xiashou.android/net.xiashou.android.HelloAndroid |
还有一些很有用处的用法
|
直接启动浏览器打开一个网址 拨打电话 |
am很可能将来成为第三方lancher的基础。
【卸装APK】
与安装类似的,卸妆是利用adb执行一个卸妆指令:
| D:\android\tools>adb |
这里,也可以看出,Android系统是将第三方应用放在data/app目录内的。
【一些思考】
因为模拟器内运行的是一个内存文件系统,也就是说,你安装的apk文件,在模拟器被关闭后,也就不再存在了(它实际上是被安装到内存里)。所以,下次启动模拟器,依然需要再次安装APK。然后,实际测试结果并非如此...于是打开AndroidSDK目录发现,tools\lib\images的文件都被更新了。原来Android模拟器是将他的内存系统实时dump到img中保存下来的。
还有一个特别有意义的发现,是从adb shell rm而来的思考。rm本身是linux的一个文件删除指令,加上前面的shell关键字,会不会adb shell直接就能打开一个linux终端呢?实测结果果然如此!不过,Android的linux shell显然做了很多精简,大量的linux常用指令都不支持。
更多关于adb详细的使用,可以使用adb help指令来查看Android模拟器能够让我们使用fat32格式的磁盘镜像作为SD卡的模拟:
以下所有操作均在windows环境
首先,运行cmd,进入命令行界面(需要预先将你放置android sdk所在目录下的tools设置到环境变量path中)
以下除eclipse方式,其他均在命令行运行
1. 创建SD文件
命令行方式: mksdcard -l sdcard 512M d:/android/mysdcard/sdcard.img 这样就在d:/android/mysdcard/sdcard.img 创建了一个512M的SD卡镜像文件
mksdcard参数如下:
mksdcard: create a blank FAT32 image to be used with the Android emulator
usage: mksdcard [-l label] <size> <file>
if <size> is a simple integer, it specifies a size in bytes
if <size> is an integer followed by 'K', it specifies a size in KiB
if <size> is an integer followed by 'M', it specifies a size in MiB
2.在模拟器中加载刚创建的SD文件
命令行方式:emulator -sdcard d:/android/mysdcard/sdcard.img
eclipse方式:(前提是安装了google android 插件), 选择菜单“Run” -> "Run Configurations..." ,进入弹出页面,选择"Targets"标签,在最下面一行"Aditional Emulator Command Line Options"下面增加启动参数 -sdcard d:/android/mysdcard/sdcard.img
3.向SD卡传输文件(管理SD卡上的内容)
可以用mtools来做管理,也可以用android SDK带的命令:
adb push local_file sdcard/remote_file
local_file表示要传输的文件绝对路径,或与Tools目录的相对路径
remote_file为Qemu中Linux目录/sdcard/文件名
eclipse方式:
通过DDMS标签中的File Explorer文件浏览器在传输如图:

增加参数:/-C
参数说明:DIR列文件、目录时显示的文件大小,其数值以千为单位进行分隔,使用此参数即“DIR/-C”将取消显示中的分隔符,以满足部分人的视觉习惯。
增加参数:/Q
参数说明:Windows是多用户操作系统,使用此参数即“DIR /Q”列文件、目录时,将显示出文件、目录的用户属性。
增加参数:/T:C、/T:A、/T:W
参数说明:使用此参数即“DIR/T:C”、“DIR/T:A”、“DIR/T:W”分别显示文件、目录的创建时间、上次访问时间和上次修改时间。
增加参数:/X
参数说明:使用此参数即“DIR/X”列文件、目录时,会对长文件名同时显示“8.3”格式的文件名。
命令:CD,改变目录
增加参数:/D
参数说明:此参数的作用是快速改变当前目录,比如当前目录是C:\Windows,使用命令“CD/D E:\Tools”可快速切换到E:\Tools目录下。注:只有在Win XP的“运行”文本框中输入“CMD”得到的DOS窗口中才能使用此参数。
命令:MD,建立目录
功能说明:此命令并未增加参数,但是增强了功能,它可一次建立多级子目录, 例如使用命令“MD AA\BB\CC\DD”将一次性创建AA、BB、CC、DD四级子目录。而在老版本的DOS中,若不存在AA子目录,便无法直接建立AA下的BB等深层子目录。
命令:RD,删除目录
增加参数:/S
参数说明:使用此参数即“RD/S”用于删除目录树,即删除目录及目录下的所有子目录和文件,相当于以前版本中的DELTREE命令。
增加参数:/Q
参数说明:使用上面的/S参数删除目录树时,系统会要求用户确认是否真的要删除。若同时使用/Q参数即“RD/S /Q”,在进行删除操作时将取消确认,相当于DELTREE命令的/Y参数。
命令:DEL,删除文件或目录
增加参数:/F
参数说明:使用此参数即“DEL/F”可删除只读文件。
增加参数:/S、/Q
参数说明:使用此参数即“DEL/S”作用与“RD/S”完全相同,即删除目录及目录下的所有子目录和文件。同时使用参数/Q,可取消删除操作时的系统确认。
增加参数:/A
参数说明:删除指定属性或指定属性以外的文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件。
命令:ATTRIB,更改文件或目录的属性
增加参数:/D
参数说明:在Win XP中我们不能把文件或文件夹设置为系统属性,只能设为只读、隐藏或存档属性。而带参数/D使用ATTRIB命令可以对文件的所有属性进行设定,设定时必须与参数/S同时使用。例如“ATTRIB /S /D +S D:\Study”,作用是将D:\Study文件夹设置为系统文件夹。
命令:Format,格式化磁盘
增加参数:/FS:filessystem
参数说明:按指定文件系统类型(FAT、FAT32、NTFS)格式化磁盘,例如“Format /FS:NTFS”。
命令:DATE、TIME,显示系统日期和时间
增加参数:/T
参数说明:使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,而不必输入新日期和时间
Win2000/XP应用之奇技酷招
每个Windows用户都希望Windows的启动速度越快越好,不过,如果你想让Windows启动速度更快些,还要掌握一些加速Windows启动的独门秘技!
1.不容忽视的磁盘IDE通道
Windows XP中有一个非常影响启动速度的设置,那就是磁盘IDE通道。一般来说,Windows XP用户不需要安装主板的IDE驱动或补丁程序,ULTRA DMA功能就已经打开了。也正因为如此,绝大多数用户会让IDE通道处于自动状态,但这会导致Windows XP启动变慢——因为主板可以连接四个IDE设备,但大多数电脑只有两个IDE设备,即硬盘和光驱。少数人可能有单硬盘、双光驱(DVD和刻录机)或双硬盘、单光驱,即便这样也只有三个IDE设备,所以一般都有1~2个IDE通道处于空闲状态。此时,你应该把并不存在的IDE设备设置为“无”,而不是“自动检测”。
提示:设置IDE通道的方法是:单击“开始→控制面板”,双击“系统”,切换到“硬件”选项卡,单击“设备管理器”,再双击“IDE ATA/ATAPI控制器”。双击下面的“主要IDE通道”或“次要IDE通道”。我们可以看到,“设备0”下面的“设备类型”不可选,表明该IDE通道目前已被使用。“设备1”下面的“设备类型”可选,如果你近期内不再添加新的IDE设备,可以将“设备类型”设置为“无”。
2.禁用服务和启用Power User
Windows 2000/XP的启动速度要比Windows 9x/Me慢,众多的服务是重要因素之一,因此普通用户禁用一些无用的服务,对启动速度也有很大帮助:
alerter (用户不在局域网并且不需要管理警报)
clipbook (用户不需要查看远程剪贴簿的剪贴页面)
distributed link tracking client (用户不使用NTFS分区并且没有连入局域网)
distributed transaction coordinator (不需要同时处理多个数据库或文件系统)
fax service (不需要发送或接收传真)
ftp publishing service(你的电脑不做为FTP服务器使用)
iis admin service (你的电脑不做为Web服务器使用)
另外,建议大家创建一个Power User用户,平时用它来登录Windows 2000/XP,因为相比管理员身份,它启动的服务更少同时也更加安全。
3.及时清理日志文件
Windows 2000/XP的日志文件比较容易被用户忽视。其实当我们每次开关机、运行程序、系统报错时,这些信息都会被记录下来,保存在日志文件中。但日志文件会随着时间的增长越来越大,从而影响了系统启动速度。我们可以自己指定日志文件的大小及处理方式:
进入“开始→设置→控制面板→管理工具”,双击“事件查看器”或是单击“开始→运行”,输入“eventvwr.msc”后回车,即可打开“事件查看器”,在右侧窗口中可看到应用程序日志、安全日志和系统日志。在任意一种日志上面右击并选择“属性”,就可以在如图所示的对话框中为日志文件设定最大值,还可以选择当日志满了以后的处理方式——一般来说让它自动覆盖一段时间以前的旧日志,这样日志文件就永远不会超出指定大小。单击“筛选器”选项卡可以指定需要写入日志文件的事件类型。
设置“系统日志”的属性
4.借花献佛加快Windows 2000 启动
Windows XP相比Windows 2000在很多方面进行了优化改进,因而启动速度更快,那么能不能让Windows 2000也可以享受这样的好处呢?其实,只要找到Windows XP相应语言版本文件,然后替换Windows 2000的相应文件即可。这两个文件为NTLDR、NTDETECT.COM,它们都在系统分区的根目录下。当然,为了防止Windows 2000出错,建议用户在替换这两个文件前备份Windows 2000原有的同名文件。
5.让蓝色滚动条只滚动一圈
这是一个适用于Windows XP的秘技。打开“注册表编辑器”,依次展开[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters]分支,然后双击右侧窗口中的DWORD值“EnablePrefetcher”,将其值由“3” 改为“1”。退出注册表编辑器并重启电脑,你会发现进入Windows XP时蓝色滚动条的滚动时间明显减少了!