从 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。也可以参考
在代码级别,如果您想:
- 使用G2H方案:直接用HMS码替换GMS码。 HMS接口和GMS接口虽然名称不同,但接口含义是一样的。您可以通过参考 API documentation.
更改接口名称
- 使用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 有效。
我的代码有什么问题?
我在 Google Play 商店中有一个应用程序。 我也打算在华为商城发布
除了使用华为 SDK 和基本的指导步骤(添加到项目 agconnect-services.json 等)重新构建应用程序之外,是否还有其他需要在代码级别更改的内容?
所有 API 都在工作吗?特别是与应用内购买相关的那些?
谢谢
首先请确认您使用的是什么GMS Kit,我可以为您提供相应的HMS Kit。也可以参考
在代码级别,如果您想:
- 使用G2H方案:直接用HMS码替换GMS码。 HMS接口和GMS接口虽然名称不同,但接口含义是一样的。您可以通过参考 API documentation. 更改接口名称
- 使用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 有效。
我的代码有什么问题?