|
本帖最后由 dragon 于 2015-7-13 16:05 编辑
【 颠覆性的APP开发体验 】
联想增强现实(AR)眼镜new glass C100系统探秘
Dragon(黑山老妖)
Extreme M.O.D
首先要明确的是,联想new glass C100基于安卓系统,所以,整个产品的开放度是很高的,功能扩展性也是极强的,APP开发效率也远超普通嵌入式系统。
眼镜开机后,首先是一个启动动画。由于开机动画很难录制,老妖我自己合成了一个,相似度99%。
开机后,联想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风格一致。
内置的导航应用,支持语音控制,可以说出目的地,语音识别率很好,使用正常语音和语速即可,无需刻意,但是你得说普通话。
确定好目的地后,必须通过单击触摸板的方式,开始导航,这一点建议增加语音控制,让整个体验过程更加一致。
导航画面有些观察困难,因为亮度不足,并且你实际看到的会比下图展示的更小。不建议开车时仔细观察导航画面,会比较危险,步行时则完全没有问题。此外,它与车载抬头显示(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
- [com.ti.nfcti_enhancement]: [true]
- [com.ti.omap_enhancement]: [true]
- [com.ti.omap_enhancement_s3d]: [true]
- [dalvik.vm.dexopt-flags]: [m=y]
- [dalvik.vm.heapgrowthlimit]: [48m]
- [dalvik.vm.heapmaxfree]: [2m]
- [dalvik.vm.heapminfree]: [512k]
- [dalvik.vm.heapsize]: [256m]
- [dalvik.vm.heapstartsize]: [5m]
- [dalvik.vm.heaptargetutilization]: [0.75]
- [dalvik.vm.lockprof.threshold]: [500]
- [dalvik.vm.stack-trace-file]: [/data/anr/traces.txt]
- [dev.bootcomplete]: [1]
- [dhcp.wlan0.dns1]: [192.168.1.1]
- [dhcp.wlan0.dns2]: []
- [dhcp.wlan0.dns3]: []
- [dhcp.wlan0.dns4]: []
- [dhcp.wlan0.gateway]: [192.168.1.1]
- [dhcp.wlan0.ipaddress]: [192.168.1.219]
- [dhcp.wlan0.leasetime]: [43200]
- [dhcp.wlan0.mask]: [255.255.255.0]
- [dhcp.wlan0.pid]: [1015]
- [dhcp.wlan0.reason]: [BOUND]
- [dhcp.wlan0.result]: [ok]
- [dhcp.wlan0.server]: [192.168.1.1]
- [dhcp.wlan0.vendorInfo]: []
- [dolby.audio.hdmi.channels]: [0]
- [dolby.audio.sink.info]: [speaker]
- [init.svc.adbd]: [running]
- [init.svc.boot_log]: [stopped]
- [init.svc.bootanim]: [stopped]
- [init.svc.btmad]: [running]
- [init.svc.btmhfpc]: [running]
- [init.svc.btmhidsrv]: [running]
- [init.svc.btmhogpsrv]: [stopped]
- [init.svc.btmnetsrv]: [running]
- [init.svc.btmusb_user]: [running]
- [init.svc.console]: [running]
- [init.svc.debuggerd]: [running]
- [init.svc.devmgrsrv]: [running]
- [init.svc.dhcpcd_wlan0]: [running]
- [init.svc.drm]: [running]
- [init.svc.flash_recovery]: [stopped]
- [init.svc.installd]: [running]
- [init.svc.keystore]: [running]
- [init.svc.media]: [running]
- [init.svc.navl_server]: [running]
- [init.svc.netd]: [running]
- [init.svc.p2p_supplicant]: [running]
- [init.svc.pvrsrvinit]: [stopped]
- [init.svc.ril-daemon]: [running]
- [init.svc.rxn_intapp]: [running]
- [init.svc.sdcard]: [running]
- [init.svc.sensord]: [running]
- [init.svc.servicemanager]: [running]
- [init.svc.setup_fs]: [stopped]
- [init.svc.smc_pa]: [stopped]
- [init.svc.surfaceflinger]: [running]
- [init.svc.tf_daemon]: [stopped]
- [init.svc.ueventd]: [running]
- [init.svc.uim]: [running]
- [init.svc.vold]: [running]
- [init.svc.wifical]: [stopped]
- [init.svc.zygote]: [running]
- [keyguard.no_require_sim]: [1]
- [media.aac_51_output_enabled]: [true]
- [net.bt.name]: [Android]
- [net.change]: [net.dnschange]
- [net.dns1]: [192.168.1.1]
- [net.dnschange]: [1]
- [net.hostname]: [android-7e038e57b63ef338]
- [net.qtaguid_enabled]: [1]
- [net.tcp.buffersize.default]: [4096,87380,110208,4096,16384,110208]
- [net.tcp.buffersize.edge]: [4093,26280,35040,4096,16384,35040]
- [net.tcp.buffersize.eth]: [524288,1048576,2097152,262144,524288,1048576]
- [net.tcp.buffersize.evdo]: [4094,87380,262144,4096,16384,262144]
- [net.tcp.buffersize.gprs]: [4092,8760,11680,4096,8760,11680]
- [net.tcp.buffersize.hsdpa]: [4094,87380,262144,4096,16384,262144]
- [net.tcp.buffersize.hspa]: [4094,87380,262144,4096,16384,262144]
- [net.tcp.buffersize.hspap]: [4094,87380,1220608,4096,16384,1220608]
- [net.tcp.buffersize.hsupa]: [4094,87380,262144,4096,16384,262144]
- [net.tcp.buffersize.lte]: [524288,1048576,2097152,262144,524288,1048576]
- [net.tcp.buffersize.umts]: [4094,87380,110208,4096,16384,110208]
- [net.tcp.buffersize.wifi]: [524288,1048576,2097152,262144,524288,1048576]
- [net.wlan0.dns1]: [49.0.0.0]
- [net.wlan0.dns2]: []
- [omap.audio.mic.main]: [DMic0L]
- [omap.audio.mic.sub]: [DMic0R]
- [omap.audio.power]: [PingPong]
- [persist.hwc.mirroring.region]: [0:0:800:480]
- [persist.sys.country]: [CN]
- [persist.sys.language]: [zh]
- [persist.sys.profiler_ms]: [0]
- [persist.sys.timezone]: [Asia/Shanghai]
- [persist.sys.usb.config]: [ptp,adb]
- [persist.wlan.ti.calibrate]: [1]
- [ro.allow.mock.location]: [0]
- [ro.baseband]: [unknown]
- [ro.board.platform]: [omap4]
- [ro.boot.bootloader]: [U-Boot_1.1.4-v1.0.red^0-dirty]
- [ro.boot.console]: [ttyO2]
- [ro.boot.devname]: [C100_114Q]
- [ro.boot.locale]: [en_US]
- [ro.boot.serialno]: [GY20H35795Z129114Q]
- [ro.boot.timezone]: [GMT+00:00]
- [ro.bootloader]: [U-Boot_1.1.4-v1.0.red^0-dirty]
- [ro.bootmode]: [unknown]
- [ro.build.characteristics]: [tablet]
- [ro.build.date.utc]: [1432992669]
- [ro.build.date]: [Sat May 30 13:31:09 UTC 2015]
- [ro.build.description]: [blaze_tablet-userdebug 4.2.2 LNV_C1_DEV_RLS_0519 eng.tutu.20150530.133009 test-keys]
- [ro.build.display.id]: [eng.CeyesC100H001S00100D20150530_Normal]
- [ro.build.host]: [b2e8db3438d0]
- [ro.build.id]: [LNV_C1_DEV_RLS_0519]
- [ro.build.product]: [blaze_tablet]
- [ro.build.tags]: [test-keys]
- [ro.build.type]: [userdebug]
- [ro.build.user]: [tutu]
- [ro.build.version.codename]: [REL]
- [ro.build.version.incremental]: [eng.tutu.20150530.133009]
- [ro.build.version.release]: [4.2.2]
- [ro.build.version.sdk]: [17]
- [ro.carrier]: [wifi-only]
- [ro.com.android.dateformat]: [MM-dd-yyyy]
- [ro.config.alarm_alert]: [Alarm_Classic.ogg]
- [ro.config.nocheckin]: [yes]
- [ro.config.notification_sound]: [pixiedust.ogg]
- [ro.config.ringtone]: [Ring_Synth_04.ogg]
- [ro.crypto.fuse_sdcard]: [true]
- [ro.crypto.state]: [unencrypted]
- [ro.debuggable]: [1]
- [ro.factorytest]: [0]
- [ro.hardware]: [omap44xxtabletboard]
- [ro.lockscreen.disable.default]: [true]
- [ro.opengles.version]: [131072]
- [ro.product.board]: [blaze_tablet]
- [ro.product.brand]: [Lenovo]
- [ro.product.cpu.abi2]: [armeabi]
- [ro.product.cpu.abi]: [armeabi-v7a]
- [ro.product.device]: [blaze_tablet]
- [ro.product.locale.language]: [zh]
- [ro.product.locale.region]: [CN]
- [ro.product.manufacturer]: [Lenovo_Group_Ltd]
- [ro.product.model]: [C100]
- [ro.product.name]: [blaze_tablet]
- [ro.product.processor]: [omap4460]
- [ro.radio.use-ppp]: [no]
- [ro.revision]: [16]
- [ro.runtime.firstboot]: [1435972729324]
- [ro.secure]: [1]
- [ro.serialno]: [GY20H35795Z129114Q]
- [ro.sf.lcd_density]: [160]
- [ro.wifi.channels]: []
- [service.bootanim.exit]: [1]
- [sys.boot_completed]: [1]
- [sys.settings_global_version]: [2]
- [sys.settings_secure_version]: [8]
- [sys.settings_system_version]: [4]
- [sys.usb.config]: [ptp,adb]
- [sys.usb.state]: [ptp,adb]
- [system_init.startsurfaceflinger]: [0]
- [video.h264enc.profile]: [1]
- [vold.post_fs_data_done]: [1]
- [wifi.interface]: [wlan0]
- [wlan.driver.status]: [ok]
- 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
|
评分
-
查看全部评分
上一篇: 曝光!联想new glass智能眼镜,增强你的现实!(首拆)下一篇: 天生玩家——葡萄游戏厅PUTAO-G1开箱评测
|