从 Google Play 商店迁移到华为商店。代码有什么变化吗?

Migration from Google Play Store to Huawei Store. Any changes in code?

我在 Google Play 商店中有一个应用程序。 我也打算在华为商城发布

除了使用华为 SDK 和基本的指导步骤(添加到项目 agconnect-services.json 等)重新构建应用程序之外,是否还有其他需要在代码级别更改的内容?

所有 API 都在工作吗?特别是与应用内购买相关的那些?

谢谢

首先请确认您使用的是什么GMS Kit,我可以为您提供相应的HMS Kit。也可以参考

在代码级别,如果您想:

  1. 使用G2H方案:直接用HMS码替换GMS码。 HMS接口和GMS接口虽然名称不同,但接口含义是一样的。您可以通过参考 API documentation.
  2. 更改接口名称
  3. 使用G+H方案:在原有逻辑代码基础上增加HMS+GMS适配层代码。添加如下代码,判断是否有GMS API或HMS API,并调用可用的API:
public boolean  isGMS(){
    return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) == com.google.android.gms.common.ConnectionResult.SUCCESS;
}
public boolean  isHMS(){
    return HuaweiApiAvailability.getInstance().isHuaweiMobileServicesAvailable(this) == com.huawei.hms.api.ConnectionResult.SUCCESS;
}

代码调用逻辑:

If ( isGMS() ) {
//GMS code
}else if ( isHMS() ){
//HMS code
}

HMS提供与GMS类似的接口。这里是 IAP documentation and Github.

你也可以使用HMS ToolKit实现G2H/G+H。

更新:

您可以使用以下代码获取productId:

PurchaseResultInfo buyResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data); 

通过 PurchaseResultInfo 声明的 buyResultInfo 对象调用 getInAppPurchaseData() 方法。 getInAppPurchaseData方法调用成功后,可以获得InAppPurchaseData

当前交易的产品ID存储在InAppPurchaseData中。 参见:here

@shirley,是的,我也找到了。

以下代码在所有设备的云调试中运行良好,但不适用于审核。 因此该应用被拒绝。

里面 activity class:

private IapClient mIAPClient;

在 activity 创建时:

mIAPClient = Iap.getIapClient(this);

当用户点击触发应用内购买的按钮时:

private void launchPurchase(String purchased_sku) {
    IapRequestHelper.createPurchaseIntent(mIAPClient, purchased_sku, IapClient.PriceType.IN_APP_NONCONSUMABLE, new IapApiCallback<PurchaseIntentResult>() {
        @Override
        public void onSuccess(PurchaseIntentResult result) {
            if (result == null) {
                Log.e(Constants.TAG, "result is null");
                return;
            }
            // you should pull up the page to complete the payment process
            IapRequestHelper.startResolutionForResult(StoreActivity.this, result.getStatus(), Constants.REQ_CODE_BUY);
        }

        @Override
        public void onFail(Exception e) {
            int errorCode = ExceptionHandle.handle(StoreActivity.this, e);
            if (errorCode != ExceptionHandle.SOLVED) {
                Log.i(Constants.TAG, "createPurchaseIntent, returnCode: " + errorCode);
                // handle error scenarios
                switch (errorCode) {
                    case OrderStatusCode.ORDER_PRODUCT_OWNED:
                        Log.i(Constants.TAG, "createPurchaseIntent, returned ORDER_PRODUCT_OWNED");
                        break;
                    default:
                        break;
                }
            }
        }
    });
}

上面捕获了一个异常onFail(Exception e)。 在尝试从 ExceptionHandle 获取 errorCode 时,我什么也没得到。

public static int handle(Activity activity, Exception e) {

    if (e instanceof IapApiException) {
        IapApiException iapApiException = (IapApiException) e;
        Log.i(TAG, "returnCode: " + iapApiException.getStatusCode());
        switch (iapApiException.getStatusCode()) {
            case OrderStatusCode.ORDER_STATE_CANCEL:
                Toast.makeText(activity, "Order has been canceled!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_STATE_PARAM_ERROR:
                Toast.makeText(activity, "Order state param error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_STATE_NET_ERROR:
                Toast.makeText(activity, "Order state net error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_VR_UNINSTALL_ERROR:
                Toast.makeText(activity, "Order vr uninstall error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_HWID_NOT_LOGIN:
                IapRequestHelper.startResolutionForResult(activity, iapApiException.getStatus(), Constants.REQ_CODE_LOGIN);
                return SOLVED;
            case OrderStatusCode.ORDER_PRODUCT_OWNED:
                Toast.makeText(activity, "Product already owned error!", Toast.LENGTH_SHORT).show();
                return OrderStatusCode.ORDER_PRODUCT_OWNED;
            case OrderStatusCode.ORDER_PRODUCT_NOT_OWNED:
                Toast.makeText(activity, "Product not owned error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_PRODUCT_CONSUMED:
                Toast.makeText(activity, "Product consumed error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_ACCOUNT_AREA_NOT_SUPPORTED:
                Toast.makeText(activity, "Order account area not supported error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_NOT_ACCEPT_AGREEMENT:
                Toast.makeText(activity, "User does not agree the agreement", Toast.LENGTH_SHORT).show();
                return SOLVED;
            default:
                // handle other error scenarios
                Toast.makeText(activity, "Order unknown error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
        }
    } else {
        Toast.makeText(activity, "external error", Toast.LENGTH_SHORT).show();
        Log.e(TAG, e.getMessage());
        return SOLVED;
    }
}

在拒绝评论的附件视频中,祝酒词显示“订单未知错误!”已显示。

但云调试中的同一个 APK 有效。

我的代码有什么问题?