图片上传功能
图片上传流程
- 采用
application/octet-stream
的格式上传文件,所以要拿到要上传的图片的临时路径,完成上传操作后(不管是否上传成功),都删除这个临时路径,避免系统存储过多无用文件 - 将文件当作参数,放入
RequestParams
对象中去 - 这里采用的是
put
方法进行上传,上传操作用的是android-async-http
这个开源框架 - 服务器的返回操作在
JsonHttpRespnseHandler
里面处理:如果成功,返回一个Json数据,里面包含一个url;如果失败,则提示网络不佳,请重新上传
图片上传要注意的点
上传签名校验
为了保证服务器只接收MME应用里面发出来的数据,对发出来的数据进行了签名校验,校验格式参照接口文档以及具体代码。
上传的文件内容被修改
刚开始调通上传接口之后,服务端接收到的图片无法打开,显示文件被损坏,在对文件数据进行分析后发现,文件的头部内容被修改,假如了这张图片上传的一些基本信息,而这又是用android-async-http
上传文件的一种标准格式:RequestParams
对象会将基本信息跟文件本身合在一起上传,文件内容是一定会被改变的。最后的解决方案是,服务端对于这种上传格式进行了识别,支持了这种上传方式。
网络状况不好的bug
在最后上线之前的测试中,发现程序最终会弹出网络不佳,请重新上传的Toast,但是抓包的数据显示,服务端最终会返回一个url,说明上传最终又是成功的,这个问题最终还没有确定是服务端的问题(是否返回了两次statusCode
),还是客户端的上传回调的问题。
其它
抓包工具Charles
因为这版开发涉及到与服务端的交互,所以需要使用抓包工具,来分析客户端与服务端之间的数据交互。Mac端最常用的一个抓包工具叫Charles
,使用也非常方便。网上的教程参考:Mac上的抓包软件Charles
横屏拍照保存异常的Bug
之前的相机如果横屏拍照,保存的图片也是横屏的,不会进行相应的翻转,特别是在用前置摄像头拍照时,出现保存的照片是反着的情况。如果要实现图片正常保存,就要用OrientationEventListener
这个抽象类,实现其onOrientationChanged
这个抽象方法,来时时获取相机这时候的角度(通过Sensor)。在具体判断横屏竖屏时,下面代码封装了一个方法,某个范围内的角度,程序会认定它是竖屏,其它的角度,则会认定是横屏。 最后会对Camera.Parameters
进行setRotation
操作。
相机开发流程参考
下面的网页里有详细介绍了相机开发的思路和流程,备用:相机开发流程参考