分类:Android

接上一篇Fiddler抓Android设备报文,虽然有了抓包工具,但是如果遇到HTTP 500这样的问题,还是很麻烦,有没有一种方法可以直接在LOGCAT中看到html报文内容呢,这样就可以快速的定位问题。

现在网络上的教程对于HTTP请求错误都是这样处理的:

StringRequest stringRequest = new StringRequest(“http://www.baidu.com”,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(“TAG”, response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(“TAG”, error.getMessage(), error);
}
});

一句
Log.e(“TAG”, error.getMessage(), error);
打印出的错误信息非常有限:

08-20 20:48:03.606: E/LOGIN-ERROR(6656): null
08-20 20:48:03.606: E/LOGIN-ERROR(6656): com.android.volley.ServerError
08-20 20:48:03.606: E/LOGIN-ERROR(6656): at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:145)
08-20 20:48:03.606: E/LOGIN-ERROR(6656): at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105)

加上Volley框架打印的错误

08-20 20:49:23.452: E/Volley(6656): [1437] BasicNetwork.performRequest: Unexpected response code 500 for

你也只能判断是服务器端出现问题,但是究竟是因为请求的参数或者方式不正确?还是服务器端哪里不对了?你是无法进一步做出改变的。

除了Fiddler抓包,就没有更好的办法了吗。

既然有错误抛出,那我们来分析一下抛出错误的VolleyError类吧。

上源码:

public class VolleyError extends Exception {
public final NetworkResponse networkResponse;

public VolleyError() {
networkResponse = null;
}

public VolleyError(NetworkResponse response) {
networkResponse = response;
}

public VolleyError(String exceptionMessage) {
super(exceptionMessage);
networkResponse = null;
}

public VolleyError(String exceptionMessage, Throwable reason) {
super(exceptionMessage, reason);
networkResponse = null;
}

public VolleyError(Throwable cause) {
super(cause);
networkResponse = null;
}
}

发现有一个networkResponse对象,这个对象我们猜测含有返回的全部消息。

再打开这个类的源码。

public class NetworkResponse {
/**
* Creates a new network response.
* @param statusCode the HTTP status code
* @param data Response body
* @param headers Headers returned with this response, or null for none
* @param notModified True if the server returned a 304 and the data was already in cache
*/
public NetworkResponse(int statusCode, byte[] data, Map<String, String> headers,
boolean notModified) {
this.statusCode = statusCode;
this.data = data;
this.headers = headers;
this.notModified = notModified;
}

public NetworkResponse(byte[] data) {
this(HttpStatus.SC_OK, data, Collections.<String, String>emptyMap(), false);
}

public NetworkResponse(byte[] data, Map<String, String> headers) {
this(HttpStatus.SC_OK, data, headers, false);
}

/** The HTTP status code. */
public final int statusCode;

/** Raw data from this response. */
public final byte[] data;

/** Response headers. */
public final Map<String, String> headers;

/** True if the server returned a 304 (Not Modified). */
public final boolean notModified;

通过看注释,我们得知,data是回应报文的包体内容,只要把data解码并显示出来,那么就有可能看到更详细的错误信息,最起码是一段HTML文档。如果网站开DEBUG模式,那么肯定会有详细的错误信息。

new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(“LOGIN-ERROR”, error.getMessage(), error);
byte[] htmlBodyBytes = error.networkResponse.data;
Log.e(“LOGIN-ERROR”, new String(htmlBodyBytes), error);
}
}

经过这样改造后,logcat中的错误输出信息就变得很详细和清晰了。

Android

最近在学习Android开发的时候,用Volley进行HTTP POST请求,可能是服务端写的有问题,总是返回500错误,Volley只返回了错误码,对Volley也不太熟悉,我们无法查看返回的HTTP的详细错误信息。

而且用浏览器通过表单构造POST请求没问题。

正在怀疑Android手机无法抓包的时候,搜到神贴,Fiddler抓真机发出的HTTP包。共享如下。

~~~~~~~~~~~~~~~~~~~~~

Fiddler 是通过代理来实现数据捕获的。对 Android 手机来说,也是通过将网络连接的代理指向 PC 机的 Fiddler 端口,来实现数据包的拦截。

下面,我以我的一次实践为例,向大家介绍如何操作。

环境:Windows7、G11(android 4.0.3)

1、首先,确保安装 Fiddler 的电脑和手机在同一局域网内,因为要将手机的代理指向 PC 机,不能互相访问是不行的。

2、Fiddler 开启远程连接。Fiddler 主菜单 Tools -> Fiddler Options…-> Connections页签,选中Allow remote computers to connect。

3、重启Fidler(这一步很重要,必须做)。

4、获取PC的IP地址:

获得安装 Fiddler 这台电脑在局域网内的 IP,在手机上设置代理服务器的时候会用到,开始菜单打开运行窗口(快捷键 Win + R),输入 cmd 回车,进入 Windows 命令行工具,输入 ipconfig 回车,获取PC的ip地址:

5、设置手机代理:

需要手机和安装 Fiddler 电脑在同一WIFI下,手机连接到WIFI。打开手机的WIFI设置界面,选中连接的WIFI,长按,弹出如下界面,选择“修改网络”。

参考网站:

http://www.jb51.net/softjc/133721.html

http://blog.csdn.net/zshq280017423/article/details/8928616

http://www.cnblogs.com/bencalie/archive/2012/02/27/2369741.html

将使用代理服务器打勾,并填上刚才在 PC 机上 ipconfig 获得的 IP 地址 192.168.1.95,端口号填 Fiddler 默认的 8888

点击保存,这样就完成了代理的设置。可以通过Fiddler抓去http数据包了。

Android

Android

我眼中的老罗

我所知道的老罗这个人的所有信息,都是大家也能得到的公众信息。包括他的演讲视频,和演讲内容差不多的《我的奋斗》这本书,还有“罗永浩可爱多”的微博。所以我知道的老罗其人,是其在公众面前的形象与特点,我并不了解现实生活中老罗的思想与性格,同时并不比别人多知道些什么,我坦白交代,所以吐槽请轻吐。

如果用一句话总结来说,罗永浩是一个追求自由平等,开放的一个人。从小,老罗就不是一个按部就班,言听计从的小孩,这也是其巨大的创造性与韧性的基础。毫无疑问,老罗有今天的成就,还与其背后默默的奋斗是有关的,很多吐槽老罗吹牛逼的人,自己就做不到老罗的努力与拼搏。罗永浩的行事风格绝对不适合孔子的那一套道德理论,在传统的中国环境中也是特立独行,在此我不评论优劣性,我只是客观描述事实。他的这套我行我素、高调做事的风格为其迎来了非常多的粉丝,同时也惹了不少谩骂。亏了脸皮够厚,心理素质过硬,甚至强过了很多大腕明星。不管是微博还是演讲,老罗总是用自己或潇洒,或幽默,或真实的语言表达着自己想表达的意思,从来不装什么文人雅士,什么傻逼、牛逼字眼屡见不鲜。

从离开新东方,到创建牛博网,可以看出老罗虽然性格不羁,不受封建思想的束缚,但其原则坚持的比较彻底,也比较聪明与清醒。相比来说很多从来不做“出格”、高调的事的“正常人”,并没有什么做人做事的原则,遇事就怂。牛博网实在是一个让人又爱又恨的所在,恨的是,如此高调赤裸的与ZF唱反调,实在是不理智的选择。爱的是,当今中国很少有人勇于表达自己的思想,特别是敢于公开表达对于国家与ZF的反面意见,而且当时的几位博主闹的是在是动静太大。这样一个网站的存在无疑给了ZF巨大的压力与不安。

他就是这样显而易见的聪明着。

老罗的营销

有人专门研究老罗的营销,我不懂营销也没学过,我只是简单的觉得老罗的营销策略只有一个,就是先自己吸引眼球,再去做吸引研究的事。老罗的营销如果成功,很多因素是因为老罗自己的人气和魅力使然。也可以说老罗先把自己营销的很好。当然,我们不能确定是刻意的营销自己,还是老罗的性格与做事方式顺带着把自己营销了。但是结果是显然的,老罗成了人气之星,有了大批粉丝与追随者。

老罗的演讲、培训学校的宣传、砸冰箱事件,都是比较另类,让人耳目一新而又在情理之中,不至于被认为过火的。

锤子ROM

吐槽启动器(Launcher)

锤子ROM在启动器上追求的目标是高效、方便、易用,不知道为什么没有美观这一项,有可能那不是重要的追求目标,也有可能发布会的时候,还没有做到。但是我觉得绝对不能放弃这个目标,下一个版本,应该会有更美观的表现。关于这三个目标,锤子ROM全部达到了,而且效果确实比较炫。交互方式不能不说是一个创新。而且这种交互方式确实是我用过的手机里,最方便快捷的。

同时,在色彩与图形图像上,反正我是无法忍受。纯色的底色加上刻板的九宫格分割线,还不能更换主题与壁纸,简直就是没有壁纸。单纯的背景更是用压抑的灰色,是可忍孰不可忍,我觉得这个以后肯定要变。

吐槽图标篇,圆角矩形的图标放在屏幕上整洁易用,不规则形状的图标虽然还原了原有的样子,但是在锤子ROM中还是放在了一个更大的矩形中,并没有实质性改变,还是得用九宫格来使得图标看起来更整齐。

这是两个吐槽的地方,通讯录、语音软件、照相机、角标、解锁什么的理念与UI设计都非常好。学到很多东西。因为很赞同所以没什么可以评论的。喜欢的自己去看视频吧。

锤子发布会高清字幕地址:锤子智能手机操作系统发布会官方版—在线播放—优酷网,视频高清在线观看

因为时间太长,我就不一一列举了。

最后放上视频最后老罗说的一句话:我知道那些我喜欢我这种张扬性格的中国人特别多,你等着,我会用下半生随手就他妈气死你。

Android 生活随笔

1、确定小论文的主题:《统一登录在中国青年创业平台中的设计与实现》

2、主要研读了SSO在JAVA WEB中的一种实现方式
http://www.blogjava.net/xcp/archive/2010/04/13/318125.html
3、阅读SSO简单介绍
http://baike.baidu.com/view/993620.htm
4、下载了了相关文献
《单点登录机制的设计与应用》
《基于HTTPS协议的统一登录系统设计与实现》
《企业门户统一登录的安全实现》
《统一的身份认证和访问控制之单点登录系统设计与实现》
5、明天主要了解微信平台的相关功能与特点

Android

Home键

在键盘上映射的就是home键,这倒是很好记。

Menu键

用于打开菜单的按键,在键盘上映射的是F2键,PgUp键同样可以。另外,看英文原文的意思,貌似这个键在某些机型上会被设计为左软件(left softkey)

Start键

这个键在模拟器和G1真机上我都没有找到到底是哪个键。映射的是Shift+F2或PgDn,某些机型会被设计为右软键(right softkey)。

Back键

返回键,用户返回上一个UI或者退出当前程序。键盘上映射ESC键。

Call/Dial键(电话键)

接听来电或启动拨号面板,这是一部手机最基本的功能键。PC键盘映射为F3键。

Hangup/Light Off键(挂机键)

挂断电话或关闭背灯用。键盘映射F4键。

Search键

在提供了Search功能的应用里快速打开Search对话框,比如在Browser里可以快速打开地址搜索栏。键盘映射F5。

Power Down键(关闭电源)

对应模拟器左上边缘的电源按钮,不过似乎在模拟器上按这个键并没什么用处。键盘映射F7。

Volume Up (增大音量)

键盘映射Ctrl+5,也可以使用小数字键盘的”+”键。

Volume Down(减小音量)

键盘映射Ctrl+6,也可以使用小数字键盘的”-”键。

Camera 键

键盘映射Ctrl+F3。不过也许是我设置有问题,在模拟上用这个快捷键似乎没任何反应。

Switch Screen Orientation (旋屏)

旋转模拟器屏幕方向,键盘映射Ctrl+F11。这是非常有用和常用的快捷键,几乎所有应用都会受到屏幕方向带来的Layout变化困扰,在开发程序时候,一定要测试屏幕方向的兼容性。

Cell Networking On/Off (手机网络开关)

这里说的手机网络指的是GPRS/3G这种数据网络,并不影响GSM网络。对于编写基于网络应用的同学,这个快捷键非常有用,可以测试网络异常中断的情况。键盘映射F8

Code Profiling

不知此为何物-.-,快捷键F9。英文原文:F9 (only with -trace startup option)

Fullscreen Mode (全屏模式)

一个没什么用的鸡肋功能。也许对于测试画面比较精细的游戏能有点帮助。快捷键是大家喜闻乐见的Alt+Enter。

Trackball mode (轨迹球模式)

这是一个非常有用的功能,按F6之后,可以打开轨迹球模式,模拟器左上角会显示一个小轨迹球。通过鼠标移动,可以模拟轨迹球的转动。对于测试利用轨迹球操作的应用会非常方便。

Trackball mode Temporaily (临时轨迹球模式)

这个功能很有意思,如果你有比较短暂的使用轨迹球的操作,那么可以按住Delete键滑动鼠标。释放Delete键会自动结束轨迹球模式。

四方向键和中心键

对应键盘四方向键和Enter键,当然也可以用数字小键盘,KEYPAD_5对应中心键。

Android

Andorid手机应用程序去请求一个服务器有很多种方法,HTTP,Socket,WebService等,每次请求都能返回数据,程序可以根据返回的值进行保存或者再次发起请求,想得到什么就请求什么,非常精准,也非常迅速。

可是像QQ,飞信,米聊,微信这些软件是怎么实现IM通信的呢?从网上找了一堆,大多数都不大明白怎么回事,现在我终于明白为什么招聘Android开发工程师的时候,要求有网络开发(TCP/IP、HTTP)了。

先列一下我查到的方法或者我知道的方法,也可能有重复的,求高手指正:

1、SMS短信PUSH

依靠运营商的短信接口,push命令短信到手机端。接收到短信后拦截,然后解析短信内容,根据解析到的指令,产生相应的动作,比如再去主动请求服务器,拉取数据。

优点:实时性强,不会耗电,不会耗费网络流量,只要有信号,就能用。可以说是几乎万能的了。

缺点:必须依靠比较大的运营商,而且如果很多人同时在线交流,SMS数量会非常之大。免费的短信接口不容易寻找到,支持性,兼容性较差。

2、简单轮询的方式

我的猜测:每隔一段时间主动向服务器发起请求,可以是HTTP请求。通信过程需要自己去写,最需要考虑的就是请求的频率,太慢了达不到即时的效果,太快了电池,流量和带宽都有限制。

优点:不需要依靠第三方,轻量级实现,灵活性好

缺点:频率需要权衡,功能需要自己封装。

3、Socket连接

优点:可以保持长连接,快速响应

缺点:手机端电力和流量消耗较大,服务器端连接数过多,负载过重

4、MQTT协议

这个没研究过,不过据说这个也能很好实现,服务器端如果是用PHP写的话,看起来就比较吃力了。

5、 C2DM方式

谷歌官方提供的服务

优点:官方式的服务,全面,有效

缺点:不支持2.2以下版本,不能自己建立服务器,服务器在国外,你懂得

6、XMPP协议

6.1 Openfire + asmack

6.2 androidPN Server + androidPN Client

第二个其实是第一个的第三方实现,但是如果自己做,还是推荐用第一种方式

未完待续。。。

Android

FM89.7 青岛交通广播

FM91.5 青岛音乐体育广播

FM 93.1 中国之声

 

FM95.2 青岛故事广播

Android

在布局文件中加入include标签,大大方便了查看布局,简化了逻辑。

比如:

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
<include  layout=”@layout/includeA” />
<include  layout=”@layout/includeB” />
</LinearLayout>

其中includeA.xml和includeB.xml都是单独的放于layout文件夹下面的布局文件

参考地址:
http://blog.csdn.net/wangljgood/article/details/6556175

Android

本文翻译的是官方开发网站的:Dev Guide>>Developing>>Tools>>Draw 9-patch

原文地址:http://developer.android.com/guide/developing/tools/draw9patch.html

 

 

—————-

前情提要:

背景自适应且不失真问题的存在
制作自适应背景图片是UI开发的一个广泛问题,也是界面设计师渴望解决的问题,我相信我们彼此都深有体会。
比如,列表的背景图一定,但是列表的高度随着列表数据项会发生变化;标题栏的背景,无论横屏还是竖屏,高分辨率还是低分辨率,都能自动填充满,而且不失真等等背景问题。
根据以往的经验,我们一般采用先切图后拼凑的做法,这种做法本来我想在这里和大家介绍一下,其实有的时候还是很有用的,但是说起来会比较麻烦,就不说这个非重点了,略去,如果大家真的要介绍,在回复中说明,我再考虑一下。
Android针对这种情况,专门制作了一种.9.PNG格式来解决这个问题。

引用自:http://www.cnblogs.com/qianxudetianxia/archive/2011/04/17/2017591.html

—————-

Draw 9-patch工具可以让你通过一个所见即所得的编辑器,轻松的创建NinePatch图片。

关于NinePatch类型图片的介绍和工作原理,请2D Graphics文档的NinePatch章节。

这是一个用Draw 9-patch工具创建Nine-Patch图片的快速教程。你需要一个已有的PNG图片用来创建一个NinePatch图片。

  1. 从终端或者命令提示行,进入“SDK目录/tools”文件夹,启动draw9patch应用程序。(刘钊注:在Win下双击draw9patch.bat即可)
  2. 把你的PNG图片拖拽到Draw 9-patch工具窗口上(或者点击File > Open 9-patch… 打开一个本地文件)。然后你的工作空间就自动打开了。
  3. 左侧面板是绘图区域,在这个区域你可以为你的拉伸区域和内容区域编辑哪些黑线。右侧面板是预览区域,从这里你可以预览到你的图片被拉伸后的样子。
  4. 单击左键用变长为1像素的小方块画出拉伸区域或者内容区域(刘钊注:顶部和左侧是画拉伸区域,黑线覆盖的地方是进行拉伸的。右侧和底部是画内容区域,相当于padding)。右键(在Mac中按住Shift加左键)删除之前划过的线。
  5. 画好后,选择File > Save 9-patch… 

    你的图片将会被保存成.9.png格式的文件。

注意:一个标准的PNG文件将会被一个透明的、1像素的边框所包围,在这个边框区域中你可以画拉伸区域和内容区域。如果加载的是9-patch文件,则会按照这个文件本来的样子加载,不再增加绘图区域,因为这个区域已经存在了。

控制选项包括:

  • Zoom:调整图片在绘图区的放大倍数
  • Patch scale:调整图片在预览区域的大小
  • Show lock:当鼠标滑过图片的时候显示不能绘图区域
  • Show patches:在绘图区预览可拉伸区域(粉红色区域是可拉伸区域)
  • Show content:在预览区高亮显示内容区域(紫色区域代表可放置内容区域)
  • Show bad patches:在拉伸的时候有可能产生缺陷的的块周围显示红色的边框。如果你消除了所有的坏块,你的被拉伸的图片就会保持连贯的视觉效果。

Android 我的翻译