dragon  发表于 2015-7-13 15:21

曝光!联想new glass智能眼镜,颠覆性的APP开发体验!

本帖最后由 dragon  于 2015-7-13 16:05 编辑

【 颠覆性的APP开发体验 】

联想增强现实(AR)眼镜new glass C100系统探秘



Dragon(黑山老妖)
Extreme M.O.D
各位好,在前一篇章中老妖我向大家详细介绍了联想new glass C100的硬件设计与做工,此次,着重介绍一下这款增强现实眼镜的软件系统与APP开发体验。
首先要明确的是,联想new glass C100基于安卓系统,所以,整个产品的开放度是很高的,功能扩展性也是极强的,APP开发效率也远超普通嵌入式系统。
眼镜开机后,首先是一个启动动画。由于开机动画很难录制,老妖我自己合成了一个,相似度99%。

如果希望同时听到声音效果,请观看FLASH版:查看flash动画
开机后,联想new glass C100会显示当前时间。请注意,这是一款增强现实(AR)产品,所以画面显示是和实景叠加的。显示画面并不大,所以不会让你满眼都是叠加画面,它的实际大小如下图演示的样子(以整幅图作为视觉范围):


后面的图片,为了各位观察方便,我将眼镜显示的区域进行了放大,就像下面这个效果,注意实际显示的没这么大。由于是实景叠加,我们在开发APP的时候,需要注意的是配色和UI元素大小的问题。配色方面,尽量使用白色,如果颜色较暗的话,区分度会比较糟糕。

联想new glass C100通过侧面的触摸板进行操作,包括单击、下划、前划、后划等四种操作。当然,还支持语音指令,比如,你可以说“开始”、“拍照”、“摄像”、“导航”等等。默认界面就是上面看到的时间显示,通过前划,可以进入到设置界面。由于该产品没有触摸屏,所以不具备定位点击能力与多点触摸能力,只能依靠语音以及这四种操作和用户交互,在开发APP时,要特别注意。
从设置界面单击进去,是以下设置项,简要看一下。
蓝牙连接界面,蓝牙4.0标准:
WIFI连接界面,802.11n标准:


设备信息界面,内置16G的eMMC闪存颗粒:


音量调整界面:
摄像画质调整界面,最大1080P:
图片画质调整界面,最大2592x1944:
固件升级界面,支持OTA:
云备份设置界面,支持百度云盘:
亮度设置界面,缺少自动亮度调节功能:
支持APP的自定义快速启动:
以上是所有设置项。联想new glass C100的主菜单见下图,目前的固件版本,拥有以下五个功能:拍照、摄像、发信息、导航、问问。我们自己开发的APP,也会显示在这里。在设计APP图标时,要注意与系统自带的APP风格一致。
存储下来的照片和视频,会形成“相册”。只需说出“相册”指令即可,也可以前划进入相册。相册同样不会充满你的视野,你实际看到的会比下图展示的更小。注意,老妖我在拿到联想new glass C100之前,非常看好车载类APP的前景,实际体验之后,发现要想做到车载应用,还是有一定门槛的,这个门槛就是视觉盲区。由于眼镜的光机端在右眼的右侧,必然会对视线形成一定的遮挡,而这种遮挡在步行时问题不大,但是开车就比较不安全。第一次驾车体验时,会给你强烈的不安全感,你会有慌乱的感觉。解决办法是将你的头上扬10°,从而避免视觉盲区的形成,驾驶信心会随之而来。这个问题是制约车载应用爆发的最大桎梏,建议下一版眼镜,光机端能够从上眼眶位置伸下来,从而解决遮挡视线的问题,同时也便于角度的调整。

对于拍摄的照片或者视频,支持分享、收藏及删除操作:
内置的导航应用,支持语音控制,可以说出目的地,语音识别率很好,使用正常语音和语速即可,无需刻意,但是你得说普通话。
确定好目的地后,必须通过单击触摸板的方式,开始导航,这一点建议增加语音控制,让整个体验过程更加一致。
导航画面有些观察困难,因为亮度不足,并且你实际看到的会比下图展示的更小。不建议开车时仔细观察导航画面,会比较危险,步行时则完全没有问题。此外,它与车载抬头显示(HUD)的效果是不同的,最主要的原因就是画面较小及亮度不足。一般情况下,车载导航在开车过程中,语音提示起到主要的作用,从这个角度讲,也不需要你仔细观察画面。再次提醒,驾驶车辆时佩戴联想new glass C100会导致视觉盲区,请谨慎。
内置的“问问”应用,类似IOS中的SIRI,但是会比SIRI傻一些。


我们来试一下,老妖我通过五种方式,希望得到圆周率的数值,均以失败告终。这款应用,对于自然语言的理解,还只停留在关键词阶段,它给我解释了五遍什么叫做圆周率。
再试一次,这次问三个常规问题,它只答对了一个。语音识别对了,但是不理解。
再从人工智能角度考验它一下,说出“我饿了”,跟SIRI做一个比较: 如果你觉得内置的APP有些不给力,没问题,联想new glass C100支持第三方APP的安装。但是老妖我提醒你一下,由于智能眼镜非常容易导致隐私泄漏,不受控制的拍摄动作,会让你面临极大的风险,遭遇陈老师的尴尬境地。所以,对于安装的APP,一定要严格把关。同时,官方固件也要做到尽量的安全,避免在WIFI环境下被入侵、植入木马,从而避免遭受持续性隐私泄漏的风险。
一个小BUG,拍摄的照片,偶尔会无法打开。
继续深挖隐私泄露风险,官方固件中的一个BUG反馈脚本,包含了抓屏、上传功能。你不要太紧张,不是拍摄,而是抓屏。但是,如果你正在用眼镜看自己的不雅自拍照,那么很遗憾,屏幕显示的内容,在极端情况下——比如恰好系统出错了,并且启动了BUG反馈机制——有可能会被抓下来,然后被send出去。目前,纯属猜测,并不确定这个机制是否会被触发。


系统分区情况:
开机动画的位置,你可以修改它:
用工具简单看一下设备信息,可用内存640M左右,安卓版本4.2.2,也就是API17。屏幕大小800x480,比例16:9。
通过系统内置的getevent命令可以获取输入设备类型:
[*]add device 1: /dev/input/event10
[*]name:   "AVRCP"
[*]add device 2: /dev/input/event5
[*]name:   "twl6030_pwrbutton"                        (电源键)
[*]add device 3: /dev/input/event9
[*]name:   "gpio-keys"                                       (拍照键)
[*]add device 4: /dev/input/event8
[*]name:   "tablet Headset Jack"                        (耳机插座)
[*]add device 5: /dev/input/event7
[*]name:   "ltr659_ps"
[*]add device 6: /dev/input/event6
[*]name:   "ltr303_als"
[*]add device 7: /dev/input/event4
[*]name:   "IT7258"                                                (触摸板)
[*]add device 8: /dev/input/event3
[*]name:   "bmm050"
[*]add device 9: /dev/input/event2
[*]name:   "bmg160"
[*]add device 10: /dev/input/event1
[*]name:   "bma_interrupt"
[*]add device 11: /dev/input/event0
[*]name:   "bma2x2"
[*]

复制代码


控制键输入代码:

[*]触摸板控制:
[*]/dev/input/event4
[*](代码略)
[*]
[*]拍照键按下:
[*]/dev/input/event9: 0001 00d4 00000001
[*]/dev/input/event9: 0000 0000 00000000
[*]
[*]拍照键抬起:
[*]/dev/input/event9: 0001 00d4 00000000
[*]/dev/input/event9: 0000 0000 00000000
[*]
[*]电源键按下:
[*]/dev/input/event5: 0001 006b 00000001
[*]/dev/input/event5: 0000 0000 00000000
[*]
[*]电源键抬起:
[*]/dev/input/event5: 0001 006b 00000000
[*]/dev/input/event5: 0000 0000 00000000
[*]
[*]耳机插入:
[*]/dev/input/event8: 0005 0002 00000001
[*]/dev/input/event8: 0005 0004 00000001
[*]/dev/input/event8: 0000 0000 00000000
[*]
[*]耳机拔出:
[*]/dev/input/event8: 0005 0002 00000000
[*]/dev/input/event8: 0005 0004 00000000
[*]/dev/input/event8: 0000 0000 00000000

复制代码


getprop拿到的系统参数,供开发参考:

[*]root@android:/ # getprop
[*]getprop
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]: []
[*]: []
[*]: []
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]: []
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]: []
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]: []
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]:
[*]root@android:/ #

复制代码

从sys/board_properties/soc目录下拿到的信息:

[*]root@android:/ # cat /sys/board_properties/soc/type
[*]cat /sys/board_properties/soc/type
[*]GP
[*]root@android:/ # cat /sys/board_properties/soc/revision
[*]cat /sys/board_properties/soc/revision
[*]ES1.1
[*]root@android:/ # cat /sys/board_properties/soc/die_id
[*]cat /sys/board_properties/soc/die_id
[*]08740002-00000001-0A3DB7F7-0B008016
[*]root@android:/ # cat /sys/board_properties/soc/family
[*]cat /sys/board_properties/soc/family
[*]OMAP4460
[*]root@android:/ # cat /sys/board_properties/soc/production_id
[*]cat /sys/board_properties/soc/production_id
[*]8002B94E-000200F0
[*]root@android:/ #

复制代码

在APP开发时,背景用黑色即可。文字及图标建议用纯白,以达到最大的区分度。UI主题请采用全屏模式。请使用800x480: mdpi进行设计预览,从而可以确保与运行时保持一致。
设计状态(800x480: hdpi)
设计状态(800x480: mdpi) 运行状态(1:1截图)
常规安卓APP开发中使用的按钮、单选复选框、滑动条、输入框等元素,在眼镜开发中,是无法通过手指直接定位点击的。因此,你必须换一种方式来实现你的意图。例如,希望调整滑动条,那么你需要设计一个独立的Activity,并且只放置一个滑动条,通过捕获触摸板的前后滑动事件,对滑动条进行调整。
老妖我建议你积极使用语音控制方式与用户交互。
最后的最后,我来解释下为什么联想new glass C100会在待机时,每个小时耗费33%的电力,直到三个小时耗光所有电力。

[*]07-12 17:34:29.655: W/System.err(776): 没有匹配的结果.(错误码:20005)
[*]07-12 17:34:29.655: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:29.655: W/System.err(776):         at gu.c(Unknown Source)
[*]07-12 17:34:29.655: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:29.655: W/System.err(776):         at gv.handleMessage(Unknown Source)
[*]07-12 17:34:29.655: W/System.err(776):         at android.os.Handler.dispatchMessage(Handler.java:99)
[*]07-12 17:34:29.655: W/System.err(776):         at android.os.Looper.loop(Looper.java:137)
[*]07-12 17:34:29.655: W/System.err(776):         at android.os.HandlerThread.run(HandlerThread.java:60)
[*]07-12 17:34:31.062: W/System.err(776): 没有匹配的结果.(错误码:20005)
[*]07-12 17:34:31.062: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:31.062: W/System.err(776):         at gu.c(Unknown Source)
[*]07-12 17:34:31.062: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:31.062: W/System.err(776):         at gv.handleMessage(Unknown Source)
[*]07-12 17:34:31.062: W/System.err(776):         at android.os.Handler.dispatchMessage(Handler.java:99)
[*]07-12 17:34:31.062: W/System.err(776):         at android.os.Looper.loop(Looper.java:137)
[*]07-12 17:34:31.062: W/System.err(776):         at android.os.HandlerThread.run(HandlerThread.java:60)
[*]07-12 17:34:32.273: W/System.err(776): 没有匹配的结果.(错误码:20005)
[*]07-12 17:34:32.273: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:32.273: W/System.err(776):         at gu.c(Unknown Source)
[*]07-12 17:34:32.273: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:32.273: W/System.err(776):         at gv.handleMessage(Unknown Source)
[*]07-12 17:34:32.273: W/System.err(776):         at android.os.Handler.dispatchMessage(Handler.java:99)
[*]07-12 17:34:32.273: W/System.err(776):         at android.os.Looper.loop(Looper.java:137)
[*]07-12 17:34:32.273: W/System.err(776):         at android.os.HandlerThread.run(HandlerThread.java:60)
[*]07-12 17:34:32.976: W/AudioFlinger(114): RecordThread: buffer overflow
[*]07-12 17:34:33.405: W/System.err(776): 没有匹配的结果.(错误码:20005)
[*]07-12 17:34:33.405: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:33.405: W/System.err(776):         at gu.c(Unknown Source)
[*]07-12 17:34:33.405: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:33.405: W/System.err(776):         at gv.handleMessage(Unknown Source)
[*]07-12 17:34:33.405: W/System.err(776):         at android.os.Handler.dispatchMessage(Handler.java:99)
[*]07-12 17:34:33.405: W/System.err(776):         at android.os.Looper.loop(Looper.java:137)
[*]07-12 17:34:33.405: W/System.err(776):         at android.os.HandlerThread.run(HandlerThread.java:60)
[*]07-12 17:34:35.249: W/System.err(776): 没有匹配的结果.(错误码:20005)
[*]07-12 17:34:35.249: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:35.249: W/System.err(776):         at gu.c(Unknown Source)
[*]07-12 17:34:35.249: W/System.err(776):         at gu.a(Unknown Source)
[*]07-12 17:34:35.249: W/System.err(776):         at gv.handleMessage(Unknown Source)
[*]07-12 17:34:35.249: W/System.err(776):         at android.os.Handler.dispatchMessage(Handler.java:99)
[*]07-12 17:34:35.249: W/System.err(776):         at android.os.Looper.loop(Looper.java:137)
[*]07-12 17:34:35.249: W/System.err(776):         at android.os.HandlerThread.run(HandlerThread.java:60)

复制代码

联想new glass C100待机时,并没有挂起后台进程,通过上述系统日志可以看出,每一秒钟,它都在进行语音识别,所以目前的待机只是关闭了光机显示而已。
总之,增强现实类APP开发,是一个全新的领域,给开发者带来的是全新的体验,和大量的、未开发的处#女地,而联想new glass C100,无疑是国内目前各路开发者朋友们抢滩登陆的最佳拍档。

如果你对智能眼镜开发有兴趣,欢迎与我探讨。

全文完,感谢观赏


Dragon(黑山老妖)
Extreme M.O.D


wjy5156 发表于 2015-7-13 15:23

很专业的测评文章!

killer 发表于 2015-7-13 15:36

龙大又出精品了,顶下

dudu111 发表于 2015-7-13 15:49

http://imgurl.eicp.net/image/flash7251.swf龙大好久不见

dragon  发表于 2015-7-13 16:11

楼上各位好久不见,这次携智能眼镜给各位见面礼{znds5}

6117549 发表于 2023-12-17 22:57

高手赐教{znds15}
页: [1]
查看完整版本: 曝光!联想new glass智能眼镜,颠覆性的APP开发体验!