我们如何将Harmony OS支持添加到inDriver Android应用程序

一切始于美国商务部将华为列入禁止与美国公司开展业务的公司名单的事实华为的回应是其智能手机采用了Harmony OS操作系统,并且拒绝在其中使用Google服务。为了不失去部分市场,我们在inDriver中集成了其支持。尽管“ OS集成”听起来很响亮-我们的应用程序,就像其他任何为Android编写的应用程序一样,都将在Harmony上运行,但是为了完成全部工作,有必要用类似的华为服务替换Google服务。



在inDriver中,我们将Google服务用于以下三个目的:

  • 发送推送通知;
  • 位置的定义;
  • 谷歌地图。

推送工具包-发送推送通知


首先,华为有一些不错的文档。但是,为了快速入门,请使用分步教程

我将不复述那里写的内容,因为在这里需要发表评论,所以我只会讲几点。

启用服务

将要求您设置数据存储位置。请注意,您以后不能更改。该位置不影响推送的直接操作,而仅是用于存储和处理有关它们的数据的位置。

集成HMS SDK

完成集成后,您可能会在构建项目时遇到问题。无论如何,在我们的Ubuntu 16.04.5 LTS构建服务器(GNU / Linux 4.4.0-174通用x86_64)上就是这种情况,而在本地运行的Mac mini(2018年末,Mojave)上一切正常。 如果添加,则可以解决此问题

Execution failed for task ':app:processIndriverReleaseManifest'. org.gradle.api.GradleException: ERROR: no manifest file found



agcp {
   manifest false
}

build.gradle应用程序级别的文件末尾禁用的清单agcp。这里的问题是,它正在agcp寻找清单文件,但找不到并加载它,这很可能是一个问题agconnect。至少这是华为官方技术支持答复我们的方式。

配置AndroidManifest.xml

我不知道为什么,但是它没有说明自动初始化,完整文档的2.6自动初始化中对此进行了描述。如果您在方法中将令牌发送到服务器,则这是必需的

public void onNewToken(String token) {}

发送消息:华为推送工具控制台。

使用它,您可以检查推送的操作。一个有趣的事实:如果您在控制台中选择Type: Notification Message,它们onMessageReceived(RemoteMessage message)绕过处理程序立即显示在电话上。

设置推送时,我经常不得不使用控制台。她和服务器发送的推送都延迟了30分钟。我希望这些是开发人员已经解决的暂时性困难。

现在我们的手机上有两个推送服务,但是我们如何组织他们的联合工作呢?首先,您需要确定电话上提供了哪些服务。在我们这里,我们决定将Google服务作为我们的优先事项。假设手机上同时提供Google和华为服务,我们将与Google合作。

我们使用可能的值将服务的状态标志发送到服务器:

- UNKNOWN
- GOOGLE
- HUAWEI

fun checkServices(context: Context): PlayServicesState {
   val googleAPI = GoogleApiAvailability.getInstance()
   when (googleAPI.isGooglePlayServicesAvailable(context)) {
       ConnectionResult.SUCCESS,
       ConnectionResult.SERVICE_MISSING,
       ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED,
       ConnectionResult.SERVICE_DISABLED -> return PlayServicesState.GOOGLE
   }
   val huaweiAPI = HuaweiApiAvailability.getInstance()
   when (huaweiAPI.isHuaweiMobileNoticeAvailable(context)) {
       com.huawei.hms.api.ConnectionResult.SUCCESS,
       com.huawei.hms.api.ConnectionResult.SERVICE_MISSING,
       com.huawei.hms.api.ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED,
       com.huawei.hms.api.ConnectionResult.SERVICE_DISABLED -> return PlayServicesState.HUAWEI
   }
   return PlayServicesState.UNKNOWN
}

服务器将根据接收到的值将推送通知发送到相应的服务。

组织他们的工作是技术问题。我就是这样做的。

FCM的事件处理:

class AppFcmListenerService : FirebaseMessagingService() {
   private val cloudMessageHandler: CloudMessageHandler = GoogleMessageHandler(this)
   override fun onMessageReceived(message: RemoteMessage) {
       cloudMessageHandler.onMessageReceived(message)
   }
}

和HCM:

class AppHmsListenerService : HmsMessageService() {
   private val cloudMessageHandler: CloudMessageHandler = HuaweiMessageHandler(this)
   override fun onMessageReceived(message: RemoteMessage) {
       cloudMessageHandler.onMessageReceived(message)
   }
}

委托给抽象类:

abstract class CloudMessageHandler { 
fun onMessageReceived(message: Any) {
   val data = getData(message)
   onMessageReceived(data)
}
private fun onMessageReceived(data: Map<String, String>) {
   //   
}
abstract fun getData(message: Any) :  Map<String, String> {
}

它具有两个实现:

对于FCM:

class FirebaseMessageHandler(override val context: Context) : CloudMessageHandler(context) {
   override fun getData(message: Any): Map<String, String> {
       return (message as RemoteMessage).data
   }
}

对于HCM:

class HuaweiMessageHandler(override val context: Context) : CloudMessageHandler(context) {
   override fun getData(message: Any): Map<String, String> {
       return (message as RemoteMessage).dataOfMap
   }
}

华为课程与Google服务的界面几乎相似。这个“几乎”我曾亲自体现在这样一个事实RemoteMessage出来com.google.firebase.messagingMap<String, String>,你想打电话RemoteMessage.getData(),并为RemoteMessagecom.huawei.hms.push- getDataOfMap()

定位套件-位置确定


可以处理位置LOCATION_SERVICE,而无需Google和华为服务即可使用。但是对于客运服务而言,准确的位置确定是重要的参数。幸运的是,Location Kit类的接口与Google服务的同名接口没有什么不同,因此它们在代码中的应用也没有不同。但是,华为服务的操作准确性较差。希望这是一个暂时的问题。
我们还遇到了通过HMS Core发送地理位置请求的事实,这意味着为了正确操作,有必要将地理位置的权限设置为“始终允许”。

位置

更换谷歌地图


在CIS中,我们使用了带有2GIS磁贴的OSM引擎。在集成的第一阶段,我们决定不使用HUAWEI的Map Kit,而仅将OSM引擎与OSM切片一起使用。一切都很简单。

发行前


我建议大家在AppGallery中启动应用程序之前,请注意失败常见原因

例如,华为发布团队将以下违规行为告知我们。

中国香港和澳门的非标准介绍

中国对其自治行政区的主权持谨慎态度,并要求将其称为“地区”。这迫使我们将提及该国家的所有标题更改为提及该国家或地区。



应用程序详细信息中有关第三方竞争产品的信息

不要忘了通过将用户发送到App Gallery中的页面,而不是Google Play商店中的页面来对应用程序进行评分:)

通常,华为服务类似于Google服务,并且直接在代码中支持它们不会造成困难。问题只能是整个华为的“生态系统”,但它们可以归因于它的年轻,并且随着时间的推移,一切都会变得更好。

All Articles