首页 > 解决方案 > 在 Android 中创建注释常量以用作函数返回类型,类似于 Google Play Billing

问题描述

我的公司有一个 Android 应用程序(用 Kotlin 编写),我们目前正在向其添加应用内计费,以符合新规则。我们还有一个使用相同数据的 iOS 和 Web 应用程序,因此我们需要在后端验证所有购买,以检查所有三个平台。在实现 Google Play Billing 库时,我遇到了一些有趣的事情,但我似乎无法弄清楚到底发生了什么。

正如我刚才提到的,我们必须将所有购买发送到我们的服务器以验证购买并更新同步数据库。我正在使用 Retrofit、表示请求和响应的两个自定义数据类以及 Gson 转换器来执行此操作。推荐的结构如下:

fun handlePurchase(purchase: Purchase) {
    if (purchase.purchaseState === PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged) {
            // Retrofit call in the viewModel
        }
     }
}

当我查看参考文档时,Purchase.PurchaseState 被列为注释。我以前从未见过在比较语句和购买中使用过的注释。purchaseState实际上返回一个 int。当我在 Android Studio 中查看反编译的类文件时,收到如下 Java 代码:

@Retention(RetentionPolicy.SOURCE)
public @interface PurchaseState {
    int UNSPECIFIED_STATE = 0;
    int PURCHASED = 1;
    int PENDING = 2;
}

做一些挖掘让我找到了Typedef annotations。这对我来说是新的,所以我尝试使用我们的自定义响应类来查看是否可以让注释以与 Purchase.PurchaseState 相同的方式工作,即我可以在比较语句中使用它来显示正确的消息一旦我收到来自服务器的响应:

viewModel.response.observe(this, {
    Log.i(TAG,"Acked: ${it.acknowledged}. Code: ${it.responseCode}")
    if(it.responseCode == AcknowledgementResponse.ResponseCode.OK) {
        Log.i(TAG, "Success")
    }
})

我能得到的最接近的是以下定义,它允许我访问内部注释但不提供对值的访问:

data class AcknowledgementResponse(val acknowledged: Boolean, @ResponseCode val responseCode: Int) {

    @Retention(AnnotationRetention.SOURCE)
    @IntDef(OK, ALREADY_EXISTS, INVALID_PURCHASE, INVALID_TOKEN, ACKNOWLEDGEMENT_ERROR)
    annotation class ResponseCode

    companion object {
        const val OK = 1;
        const val ALREADY_EXISTS = 2;
        const val INVALID_PURCHASE = 3;
        const val INVALID_TOKEN = 4;
        const val ACKNOWLEDGEMENT_ERROR = 5;
    }
}

我目前的假设是问题源于注释、常量或两者的错误放置。任何指导和/或建议都会有所帮助!

标签: androidkotlinannotationsin-app-purchasegoogle-play-billing

解决方案


推荐阅读