在程序中输出日志, 使用 android.util.Log 类.
该类提供了若干静态方法

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)的日志信息.

示例代码如下:
Java代码 复制代码
  1. package com.zijun;   
  2.   
  3. import android.app.Activity;   
  4. import android.content.Context;   
  5. import android.graphics.Canvas;   
  6. import android.os.Bundle;   
  7. import android.util.Log;   
  8. import android.view.MotionEvent;   
  9. import android.view.View;   
  10.   
  11. public class MyAndroid extends Activity {   
  12.        
  13.     protected static final String ACTIVITY_TAG="MyAndroid";   
  14.        
  15.     @Override  
  16.     protected void onCreate(Bundle icicle) {   
  17.         super.onCreate(icicle);   
  18.         setContentView(new MyView(this));   
  19.     }   
  20.     public class MyView extends View {   
  21.         public MyView(Context c) {   
  22.             super(c);   
  23.         }   
  24.         @Override  
  25.         protected void onDraw(Canvas canvas) {   
  26.     
  27.         }   
  28.         @Override  
  29.         public boolean onMotionEvent(MotionEvent event) {   
  30.             Log.i(MyAndroid.ACTIVITY_TAG, "=============================");   
  31.                
  32.             Log.d(MyAndroid.ACTIVITY_TAG, "Haha , this is a DEBUG of MyAndroid. ");   
  33.             Log.i(MyAndroid.ACTIVITY_TAG, "Haha , this is a INFO of MyAndroid. ");   
  34.             Log.w(MyAndroid.ACTIVITY_TAG, "Haha , this is a WARNING of MyAndroid. ");   
  35.   
  36.             return true;   
  37.         }   
  38.            
  39.     }   
  40.   
  41. }  




以上程序运行后, 在命令行执行  adb logcat -s MyAndroid:I
然后在手机模拟器的屏幕上 点击 拖动鼠标 就能看到相应的日志信息.

 

 

logcatAndroid中一个命令行工具,可以用于得到程序的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.

posted @ 2008-11-22 18:04 jsot 阅读(3163) 评论(0) 编辑
前言

本文将讲述一种在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与他联系
posted @ 2008-11-22 15:08 jsot 阅读(610) 评论(2) 编辑
玩过了一天Android模拟器,也写了几个小测试程序。突然有个问题出现,如果脱离Eclipse开发环境,如何能将APK包部署给模拟器呢?
研究了一下模拟器的内存文件系统,似乎没什么发现,是一个Linux内核。
于是到google问问老外们,终于知道了,吼吼。
 
【安装APK】
安装APK当然首先是要有模拟器,和要安装的APK包,这个不多废话了。直接切入正题,在模拟器安装APK。
首先,将模拟器执行起来,直到正式进入系统。
接下来,打开一个cmd窗口,路径切换到模拟器目录下的tools目录。
输入:adb install 你要安装的apk文件的路径。
如果看到一行类显示传输速度的文字,那说明安装成功了。

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
100 KB/s (0 bytes in 164464.001s)

回到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"
    package="net.xiashou.android">
    <application android:icon="@drawable/icon">
        <activity android:name=".HelloAndroid" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

xml文件中,红色一行是表示这个apk属于哪个归类里,如果不正确的填写这个信息,Launcher将不会将其显示在桌面上,因为它会认为这个应用部署以自己的归类。

那么,是不是我们就无法执行缺失了category的apk了呢?

后来,在一个老外的blog上,查到了方法:在shell内使用am来加载android应用

usage: am [start|instrument]
       am start [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
                [-c <CATEGORY> [-c <CATEGORY>] ...]
                [-e <EXTRA_KEY> <EXTRA_VALUE> [-e <EXTRA_KEY><EXTRA_VALUE> ...]
                [-n <COMPONENT>] [-D] [<URI>]
       am instrument [-e <ARG_NAME> <ARG_VALUE>] [-p <PROF_FILE>]
                [-w] <COMPONENT>

比如启动一个manifest为如下内容的apk

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.xiashou.android">
    <application android:icon="@drawable/icon">
        <activity android:name=".HelloAndroid" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

使用的指令为:

am start -n net.xiashou.android/net.xiashou.android.HelloAndroid

 

还有一些很有用处的用法

直接启动浏览器打开一个网址
# am start -a android.intent.action.VIEW -d http://www.xiashou.net/

 

拨打电话
# am start -a android.intent.action.CALL -d tel:10086

启动google map直接定位在天津
# am start -a android.intent.action.VIEW geo:0,0?q=tianjin

am很可能将来成为第三方lancher的基础。

【卸装APK】

与安装类似的,卸妆是利用adb执行一个卸妆指令:

D:\android\tools>adb shell rm data/app/NetScramble_1.1.apk

这里,也可以看出,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指令来查看
posted @ 2008-11-22 14:42 jsot 阅读(1268) 评论(0) 编辑

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文件浏览器在传输如图:

posted @ 2008-11-22 14:03 jsot 阅读(2837) 评论(2) 编辑
命令:DIR,列文件、目录

增加参数:/-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时蓝色滚动条的滚动时间明显减少了!
posted @ 2008-11-22 12:01 jsot 阅读(98) 评论(1) 编辑