上篇文章,我们重点介绍了一下二维码登录的流程,以及每个“角色”要做的事情,下面我们重点分析TV角色所做的工作。
TV主要完成二维码图片显示,以及websocket请求。下面重点说一下这两点。
1. Base64转码Bitmap
服务端返回二维码图片的二进制数据,我们需要将其转成图片。这个问题不大,
android系统原生支持Base64转码的,并且提供了丰富的API。使用方式如下:
byte[] = null; // 将得到的String字符串通过Base64转为字节数组 c = Base64.decode(qrCode.img_base64, Base64.DEFAULT); // 根据byte数组创建Bitmap Bitmap bitmap = BitmapFactory.decodeByteArray(c, 0, c.length); ivCodeImage.setImageBitmap(bitmap);
2. websocket支持
Wedsocket是HTML 5一种新的 协议,它是实现了浏览器和服务器全双工通信,可以自行百度。
由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。
这种传统的HTTP request 的模式带来很明显的缺点: 浏览器需要不断的向服务器发出请求(request),
然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽。
在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。
两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:
1. Header
互相沟通的Header是很小的-大概只有 2 Bytes
2. Server Push
服务器可以主动传送数据给客户端
在android上,实现Websocket是开源项目非常多,autobahn, JWebsocket等,这里我使用的是精简过的autobahn类库,
因为autobahn除了实现Websocket协议外,还实现了Websocket Application Messageing 协议(Websocket子协议)。
这里我们只要用Websocket实现就可以了。
使用代码如下:
private void excuteWebcoketTask() { System.out.println("开始连接websocket///"); final WebSocketConnection wsc = new WebSocketConnection(); try { // 测试拍照登录的地址 wsc.connect( "ws://test.api.3g.youku.com/thirdpart/session/pull?pid=e80933b38c5c019d&ver=1.7.0", new WebSocketConnectionHandler() { @Override public void onBinaryMessage(byte[] payload) { Logger.e(TAG, "onBinaryMessage size=" + payload.length); } @Override public void onClose(int code, String reason) { Logger.e(TAG, "onClose reason=" + reason); } @Override public void onOpen() { Logger.e(TAG, "onOpen"); // wsc.sendTextMessage("Hello!"); wsc.sendTextMessage("9c553730ef5b6c8c542bfd31b5e25b69"); // wsc.disconnect(); } @Override public void onRawTextMessage(byte[] payload) { Logger.e(TAG, "onRawTextMessage size=" + payload.length); } @Override public void onTextMessage(String payload) { Logger.e(TAG, "onTextMessage" + payload); Toast.makeText(QRCodeLoginActivity.this, payload, Toast.LENGTH_SHORT).show(); } }); } catch (WebSocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Websocket实现参见demo:点我下载
最终效果(demo无卖相,勿喷)
原文链接:http://www.67tgb.com/?p=622
转载注明:望月听涛
2楼lfmilaoshi3天前 21:44这都是非常实用的技术,分享给大家,给人类的贡献。Re: wangyuetingtao昨天 14:42回复lfmilaoshin谢谢老师鼓励,汗颜了 ,呵呵 - -!1楼a1314517love6天前 11:26闪电登录,需要网给力是吧兵哥Re: wangyuetingtao6天前 14:25回复a1314517loven闪电是说面前输入用户名和密码,一拍即可登录。网络只要通即可,呵呵下面是这个类的一些功能:
1.设置icon上的数字图标
//设置主界面icon上的数字图标,在2.0中引进, 缺省为0
[UIApplicationsharedApplication].applicationIconBadgeNumber = 4;
2.设置摇动手势的时候,是否支持redo,undo操作
//摇动手势,是否支持redo undo操作。
//3.0以后引进,缺省YES
[UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;
3.判断程序运行状态
//判断程序运行状态,在2.0以后引入
/*
UIApplicationStateActive,
UIApplicationStateInactive,
UIApplicationStateBackground
*/
if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){
NSLog(@"程序在运行状态");
}
4.阻止屏幕变暗进入休眠状态
//阻止屏幕变暗,慎重使用,缺省为no 2.0
[UIApplicationsharedApplication].idleTimerDisabled =YES;
(慎重使用本功能,因为非常耗电)
5.显示联网状态
//显示联网标记 2.0
[UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;
6.在map上显示一个地址
NSString* addressText =@"1 Infinite Loop, Cupertino, CA 95014";
// URL encode the spaces
addressText = [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:urlText]];
7.发送电子邮件
NSString *recipients =@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";
NSString *body =@"&body=It is raining in sunny California!";
NSString *email = [NSStringstringWithFormat:@"%@%@", recipients, body];
email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:email]];
8.打电话到一个号码
// Call Google 411
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];
9.发送短信
// Text to Google SMS
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];
10.打开一个网址
// Lanuch any iPhone developers fav site
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];
简单的小例子,不做过多说明了:
//把摄像头视野 打印出png图片 private Rect CutRect = new Rect(0, 0, 1, 1); private Image MakeCameraImg(Camera mCam,int width,int height) { Image mImage; RenderTexture rt = new RenderTexture(width, height, 2); mCam.pixelRect = new Rect(0, 0, Screen.width, Screen.height); mCam.targetTexture = rt; Texture2D screenShot = new Texture2D((int)(width * CutRect.width), (int)(height * CutRect.height), TextureFormat.RGB24, false); mCam.Render(); RenderTexture.active = rt; screenShot.ReadPixels(new Rect(width * CutRect.x, width * CutRect.y, width * CutRect.width, height * CutRect.height), 0, 0); mCam.targetTexture = null; RenderTexture.active = null; UnityEngine.Object.Destroy(rt); byte[] bytes = screenShot.EncodeToPNG(); //string filename = Application.dataPath + "/Imgs/Img" // + System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".png"; //System.IO.File.WriteAllBytes(filename, bytes); mImage = Image.GetInstance(bytes); return mImage; }