在中国大陆地区使用Mobile SDK,除了通过密钥注册应用程序,还需要登录DJI账号进行实名制认证。如果无人机没有与某个DJI账号绑定,那么还需要提示用户跳转到DJI GO、DJI GO 4等应用程序中绑定无人机。如果应用程序没有经过实名制认证,或者无人机没有绑定,那么Mobile SDK无法接收图传信息,并且其飞行高度限制在30m,飞行半径显示在100m之内。
本节仅适用于针对在中国大陆地区开发Mobile SDK应用程序,包括如下几个方面的内容。
(1)DJI账号的登录与退出。
(2)获取与监听应用程序激活状态和无人机绑定状态。
(3)跳转到DJI GO或DJI GO 4的方法。
上述内容涉及两个主要的管理器对象,分别为用户账号管理器UserAccountManager和应用程序激活管理器AppActivationManager。由于实名制认证的结果和状态通过应用程序激活管理器的getAppActivationState()方法获取,因此实名制认证状态也就是应用程序的激活状态。
为了完成上述功能,我们首先修改MainActivity的用户界面,在其中增加一些文本框和按钮,即打开activity_main.xml文件添加如代码3-10所示的内容。
代码3-10
实名制认证(激活应用程序)是通过登录DJI账号实现的。具体来说,是通过用户账号管理器的logIntoDJIUserAccount(…)方法弹窗登录账号的。现在,我们在MainActivity.java中创建一个initUI()方法,用于初始化UI界面。然后,在MainActivity的onCreate(…)方法中调用initUI()方法。最后,在initUI()方法中获取【登录DJI账号】按钮的实例,并监听其单击事件。在单击【登录DJI账号】按钮后调用用户账号管理器的logIntoDJIUserAccount(…)方法。具体的代码如代码3-11所示。
代码3-11
在上述代码中,logIntoDJIUserAccount(…)方法的回调中包含了onSuccess(…)和onFailure(…)两个回调函数。前者在登录成功时回调,后者在登录失败时回调。
与登录DJI账号类似,使用用户账号管理器的logoutOfDJIUserAccount(…)方法即可退出DJI账号。在MainActivity类的initUI()方法的末尾添加如代码3-12所示的内容。
代码3-12
但是,与登录DJI账号不同的是,退出DJI账号方法的回调对象中只包括onResult(DJIError djiError)一个回调函数。当djiError参数为空时,说明退出成功;反之,则可通过djiError对象的getDescription()方法获取其错误的具体信息。
应用程序激活状态由应用程序激活管理器的应用程序激活状态AppActivationState枚举类型决定,包括不支持(NOT_SUPPORTED)、需要登录激活(LOGIN_REQUIRED)、已激活(ACTIVATED)和未知(UNKNOWN)四种状态。当未连接无人机时,激活状态为UNKNOWN;当网络无法访问且未被激活时,激活状态为NOT_SUPPORTED;当连接无人机且网络状态正常,激活状态为LOGIN_REQUIRED时,则需要登录DJI账号进行在线实名制认证。通过应用程序激活管理器的getAppActivationState()方法即可获得应用程序激活状态对象。在MainActivity类的initUI()方法的末尾添加如代码3-13所示的内容。
代码3-13
无人机绑定状态由应用程序激活管理器的无人机绑定状态AircraftBindingState枚举类型确定,包括不支持(NOT_SUPPORTED)、初始化(INITIAL)、已绑定(BOUND)、无须绑定(NOT_REQUIRED)、未绑定(UNBOUND)、未绑定且无法同步(UNBOUND_BUT_CANNOT_SYNC)和未知(UNKNOWN)等类型。这里的同步是指当前移动应用程序中无人机绑定状态信息在无人机之间的同步。
通过应用程序激活管理器的getAircraftBindingState()方法即可获得无人机的绑定状态信息。在MainActivity类的initUI()方法的末尾添加如代码3-14所示的内容。
代码3-14
编译并运行程序,单击【登录DJI账号】按钮即可弹出用于DJI用户登录的窗口,如图3-13所示。连接无人机后,单击【获取应用激活状态】按钮和【获取无人机绑定状态】按钮可分别弹出应用程序激活状态(实名制认证)和无人机绑定状态的提示框。
图3-13 登录DJI账号(Android)
只有当应用程序激活状态为ACTIVATED,并且无人机绑定状态为BOUND时,无人机的各项功能才可正常使用。
当无人机绑定状态为UNBOUND或者UNBOUND_BUT_CANNOT_SYNC时,开发者需要引导用户跳转到DJI GO或DJI GO 4软件进行无人机绑定。
跳转到DJI GO的代码如下:
跳转到DJI GO 4的代码如下:
执行上述代码后,如果已安装DJI GO(或DJI GO 4)软件,则会通知用户自动跳转到DJI GO(Android)(见图3-14),否则会弹出相应的“未安装DJI Go 4?”提示。应用跳转失败如图3-15所示。
图3-14 跳转到DJI GO(Android)
图3-15 应用跳转失败
❀ 由于DJI GO和DJI GO 4应用程序所针对的无人机类型不同,所以开发者应当根据无人机的具体类型决定跳转到DJI GO还是DJI GO 4。无人机的类型可通过无人机对象的getModel()方法获取。
除了通过应用程序激活管理器对象的getAppActivationState()方法获取应用程序激活状态信息,还可通过应用程序激活监听器AppActivationListenter实时监听并获取应用程序的激活状态信息。通过应用程序激活管理器的addAppActivationStateListener(…)方法或removeAppActivationStateListener(…)方法可分别添加或移除此类监听器。
类似地,通过无人机绑定状态监听器AircraftBindingStateListener可实时监听并获取无人机绑定状态信息。通过应用程序激活管理器对象的addAircraftBindingStateListener()方法或removeAircraftBindingStateListener()方法可分别添加或移除上述监听器。
具体的实现方法如下所示。
(1)在MainActivity.java文件中添加如下成员变量:
(2)在initUI()方法中初始化文本视图成员变量。在新创建的initListener()方法中初始化应用程序激活状态监听器和无人机绑定状态监听器,并且initListener()方法由onCreate(…)方法负责调用,如代码3-15所示。
代码3-15
应用程序激活监听器和无人机绑定监听器都采用了onUpdate(…)方法,并且分别传递回来了AppActivationState对象和AircraftBindingState对象。为了将状态信息显示在相应的文本框中,上述代码通过runOnUiThread(…)方法跳转到UI线程对文本框进行更新。由于涉及线程跳转,在AppActivationState对象和AircraftBindingState对象前需要通过final关键词进行修饰。
(3)复写MainActivity的OnDestory()生命周期方法,并移除应用程序激活监听器和无人机绑定监听器,以防止出现当MainActivity对象被回收后,应用程序激活管理器单例对象还保留着MainActivity中的监听器方法从而出现错误,如代码3-16所示。
代码3-16
❀ 在许多情况下,很难定位和查找Mobile SDK的内部异常。因此,为了避免出现这些问题,开发者一定要养成良好的编程习惯。其中很重要的一个方面就是要管理好Mobile SDK中的各类监听器,有添加(add)就要有移除(remove),有设置(set)就要有取消设置(unset)。
编译并运行程序,DJI账号登录界面如图3-13所示,连接无人机后,应用程序激活状态和无人机绑定状态如图3-16所示。
图3-16 应用程序激活状态与无人机绑定状态(Android)