Android Wear开发的踩坑史……
AndroidWear开发
需要SDKTools 23.0.0以上以及API20
以上的SDK
环境搭建
下载AndroidWear手机应用,最好是国际版,我用的华为手表,开机之后会有引导,可以扫描二维码下载对应的国际版AndroidWear,然后扫描设备,配对,同步一段时间,手表就能开始运行了
后来把手表刷到2.0做开发,这个AndroidWear就连不上了,要使用Google的开发者预览版
在手表上开启开发者选项,就是在设置
->关于
里面,点击版本号七次,然后在开发者选项里面开启ADB调试
,同时也开一下通过蓝牙调试
进入手机的AndroidWear应用,右上角的设置
里面,开启通过蓝牙调试
,有两个连接,主机
是电脑与手机的连接,目标
是手机与手表的连接,在电脑的命令行输入命令进行连接,手表上确认后就可以调试了
adbforward tcp:4444 localabstract:/adb-hub
adb connect localhost:4444
有时候下面那条命令连不上,把
localhost
换成127.0.0.1
试试
创建工程
创建工程跟一般的Android工程差不多,注意除了Phone and Tablet
之外多选一个Wear
,这样你的工程就包含mobile
和wear
两个模块了,后者就是手表端的代码
很多代码都通用,理论上把手机端的应用直接装手表上也能跑起来,但是界面就不能看了,所以还是需要遵守一下手表端的交互规范,但是这东西很新而且一直也在更新,很多东西说过时就过时,也是不用太纠结
GridViewPager
多页的展示我用了这个,类似ViewPager
,但是它是2D
的更强大一点,然而我也没用到这个特性,配合DotsPageIndicator
做指示器
三个页面,我希望初始显示第2页,那么就要用到setCurrentItem(0,1)
,但是没有效果,后来发现手表毕竟性能比较弱,可能是还没初始化完这个GridViewPager
就进行设置导致无效,所以用了这段代码就好了
Runnable dirtyHack = new Runnable() {
@Override
public void run() {
pager.setCurrentItem(0, 1);
}
};
WearableListView
用于列表展示,然而并不是ListView
的子类,而是RecyclerView
的子类,这个类在2.0
就废了
显示列表头
跟手机上的列表显示不同,手表上会自己做处理,把列表的第一项显示在屏幕中心,体验会好一点,上面还有一半的空白还专门有个函数onTopEmptyRegionClick()
来处理这里的点击,但是我没找到有方法可以获得这个区域,往里面填充点我想要的列表头什么的,又没有ListView
的比较方便的addHeaderView()
的方法,RecyclerView
根据项类型不同改变布局的话,有需要自己调整列表的偏移,总体来说这个需求就比较恶心,我就直接用了几层布局,反正列表初始显示时上方是露出的,滑动时覆盖掉也是可以达到预期
下拉刷新
使用了SwipeRefreshLayout
,试了其他的没成功,然后这个库好像刷新头就是那个旋转尖头,还能设置多种颜色挨着变,可定制性就不太高,不过对手表这种轻量的场合也就够了
加载更多
没有找到实现方法,按照网上流行的RecyclerView
加载更多的实现方法,需要用到某个LayoutManager
,WearableListView
里面继承了这个并且设置为了private
,导致那个判定某项是否是最后一项的方法调不到,不想多折腾,在列表里面加入一个判断项,用来显示加载更多
好了
列表项显示效果
圆形表盘引入的问题,一页显示三项,中间项较大,这样视觉效果会比较好,为此可以自定义一个布局,实现WearableListView.OnCenterProximityListener
这个接口,在onCenterPosition()
和onNonCenterPosition()
两个函数里面做一下缩放的动画,类似冒泡的效果
最初会有列表无法滑动的问题,可能是跟
GridViewPager
冲突了,用这句代码解决listView.setGreedyTouchMode(true)
,也是很无语
WearableRecyclerView
2.0
推荐使用的列表,它可以显示一个弧状的列表,好处是可以显示更多的内容
数据传输
2.0
以前的手表一般是依赖手机工作的,因为其自身不支持网络,所有的数据都从手机获得,所以数据传输方面的API特别重要,也很坑
方法和类本身很简单,先连接到GoogleApiClient
,注册DataApi
和MessageApi
的监听,就可以收发消息,也可以同步数据(相当于两端公用一个数据结构,一方的改动会推送到另一方)
但是,它是基于GooglePlayService
的,在国内基本处于不可用状态,华为官网提供了一个可用的版本,应该是做过处理了,然而能不能通信还是有很多坑点
wear
和mobile
用的库版本需要是一样的- 调试版本一般是可以通信的,发布版本有一定的要求
- 蓝牙要保持连接,
AndroidWear
也要保持运行 - 可以在没有
GooglePlayServiceFramework
的手机上工作(可能是华为的库做过处理)
打包发布
2.0
以前wear
的apk是附在mobile
里面的,手机安装时推送到手表端,两种打包方式
自动打包
mobile
的build.gradle
里加入
dependencies {
wearApp project(':wear')
}
那个:wear
就是手表的工程,然后Build
->Generate Signed APK
,这样的话就同时签名了
手动打包
mobile
的AndroidMenifest.xml
要包含wear
的全部权限
确保两个工程有同样的包名和版本号(可能都是不需要的,因为接下来需要提供一个描述文件,里面都有指定,没验证过)
把正式版wear
的apk拷贝到res/raw
目录,假设命名为wearable_app.apk
创建res/xml/wearable_app_desc.xml
文件
<wearableApp package="[包名]"
<versionCode>1</versionCode>
<versionName>1.0</versionName>
<rawPathResId>wearable_app</rawPathResId>
</wearableApp>
在mobile
的AndroidMenifest.xml
里的<application>
标签里添加
<meta-data android:name="com.google.android.wearable.beta.app" android:resource="@xml/wearable_app_desc" />
构建正式版mobile
应用
2.0
就可以独立安装手表的apk了,我的最终配置是下面这样然后能够工作(主要指通信部分):
- 两边的包名相同
- 两边的版本号不同
mobile
并没有做手动打包的3/4/5步
杂七杂八的配置
做的过程并没有记得很清楚,所以一些配置可能并不是必要的,但是如果遇到奇怪的无法通信的错误可以试试
AndroidMenifest.xml
中加入手表的特性
手机端
<uses-feature android:name="android.hardware.type.watch" android:required="false" />
手表端
<uses-feature android:name="android.hardware.type.watch" />
可能wear
编译缺少库时,在<appliaction>
标签下加入
<uses-library android:name="com.google.android.wearable" android:required="false" />
华为提供的库是个aar
,需要在build.gradle
中加入支持
android {
......
repositories {
flatDir {
dirs : 'libs'
}
}
......
}
dependencies {
......
compile(name : 'play-services-7.8.87', ext : 'aar')
......
}
刷机升级到2.0
- 进入开发者模式,打开
ADB调试
adb devices
可以看到设备,看不到是连接问题,也可能是驱动问题,用MAC吧,我的就是连不上Windowsadb reboot bootloader
进入BootLoaderfastboot oem unlock
解锁- 在官网下载正确的镜像(华为的国内版镜像在最下面,请仔细)
- 解压,执行命令
flash-all.sh
,等待镜像刷好,重启就好了
关于第4步,我在集成友盟统计的时候,需要访问
/data
文件夹,但是一直提示没有权限,后来“奇迹般”的又好了,期间可能的操作就是我又进行了锁定操作fastboot oem lock
,没有进一步验证过
刷机后,应用市场上的AndroidWear软件可能会在于手表端数据传输时出问题,应该用官网上提供的预览版软件