1

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

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

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

谢谢

4

2 回答 2

2

首先,请查看您使用的是什么 GMS Kit,我可以为您提供相应的 HMS Kit。你也可以参考这个答案

在代码级别,如果您想:

  1. 使用G2H方案:直接用HMS代码替换GMS代码。虽然HMS接口的名称与GMS接口的名称不同,但接口的含义是相同的。您可以通过参考API 文档来更改接口名称。
  2. 使用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 文档Github

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

更新:

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

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

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

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

内购数据

于 2020-11-17T11:39:06.913 回答
0

@shirley,是的,我实际上也找到了它。

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

内部活动类:

private IapClient mIAPClient;

关于活动创建:

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;
    }
}

在拒绝评论的视频中,带有消息“订单未知错误!”的祝酒词 显示。

但是 Cloud Debugging 中的同一个 APK 可以工作。

我的代码有什么问题?

于 2020-11-26T08:56:09.437 回答