湖畔镇

AndroidWear开发心得

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,这样你的工程就包含mobilewear两个模块了,后者就是手表端的代码

很多代码都通用,理论上把手机端的应用直接装手表上也能跑起来,但是界面就不能看了,所以还是需要遵守一下手表端的交互规范,但是这东西很新而且一直也在更新,很多东西说过时就过时,也是不用太纠结

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加载更多的实现方法,需要用到某个LayoutManagerWearableListView里面继承了这个并且设置为了private,导致那个判定某项是否是最后一项的方法调不到,不想多折腾,在列表里面加入一个判断项,用来显示加载更多好了

列表项显示效果

圆形表盘引入的问题,一页显示三项,中间项较大,这样视觉效果会比较好,为此可以自定义一个布局,实现WearableListView.OnCenterProximityListener这个接口,在onCenterPosition()onNonCenterPosition()两个函数里面做一下缩放的动画,类似冒泡的效果

最初会有列表无法滑动的问题,可能是跟GridViewPager冲突了,用这句代码解决listView.setGreedyTouchMode(true),也是很无语

WearableRecyclerView

2.0推荐使用的列表,它可以显示一个弧状的列表,好处是可以显示更多的内容

数据传输

2.0以前的手表一般是依赖手机工作的,因为其自身不支持网络,所有的数据都从手机获得,所以数据传输方面的API特别重要,也很坑

方法和类本身很简单,先连接到GoogleApiClient,注册DataApiMessageApi的监听,就可以收发消息,也可以同步数据(相当于两端公用一个数据结构,一方的改动会推送到另一方)

但是,它是基于GooglePlayService的,在国内基本处于不可用状态,华为官网提供了一个可用的版本,应该是做过处理了,然而能不能通信还是有很多坑点

  1. wearmobile用的库版本需要是一样的
  2. 调试版本一般是可以通信的,发布版本有一定的要求
  3. 蓝牙要保持连接,AndroidWear也要保持运行
  4. 可以在没有GooglePlayServiceFramework的手机上工作(可能是华为的库做过处理)

打包发布

2.0以前wear的apk是附在mobile里面的,手机安装时推送到手表端,两种打包方式

自动打包

mobilebuild.gradle里加入

dependencies {
    wearApp project(':wear')
}

那个:wear就是手表的工程,然后Build->Generate Signed APK,这样的话就同时签名了

手动打包

mobileAndroidMenifest.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>

mobileAndroidMenifest.xml里的<application>标签里添加

<meta-data android:name="com.google.android.wearable.beta.app" android:resource="@xml/wearable_app_desc" />

构建正式版mobile应用

2.0就可以独立安装手表的apk了,我的最终配置是下面这样然后能够工作(主要指通信部分):

  1. 两边的包名相同
  2. 两边的版本号不同
  3. 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

  1. 进入开发者模式,打开ADB调试
  2. adb devices可以看到设备,看不到是连接问题,也可能是驱动问题,用MAC吧,我的就是连不上Windows
  3. adb reboot bootloader进入BootLoader
  4. fastboot oem unlock解锁
  5. 在官网下载正确的镜像(华为的国内版镜像在最下面,请仔细)
  6. 解压,执行命令flash-all.sh,等待镜像刷好,重启就好了

关于第4步,我在集成友盟统计的时候,需要访问/data文件夹,但是一直提示没有权限,后来“奇迹般”的又好了,期间可能的操作就是我又进行了锁定操作fastboot oem lock,没有进一步验证过
刷机后,应用市场上的AndroidWear软件可能会在于手表端数据传输时出问题,应该用官网上提供的预览版软件

分享