Миграция из Google Play Store в Huawei Store. Какие-нибудь изменения в коде?
У меня есть приложение в Google Play Store. Планирую опубликовать его также в магазине Huawei.
Помимо повторной сборки приложения с использованием SDK Huawei и основных инструкций (добавить в проект agconnect-services.json и т. Д.), Есть ли что-то еще, что нужно изменить на уровне кода?
Все ли API работают? Особенно те, которые связаны с покупками в приложении?
благодаря
2 ответа
Во-первых, проверьте, какой комплект GMS вы используете, и я могу предоставить вам соответствующие комплекты HMS. Вы также можете обратиться к этому ответу.
На уровне кода, если вы хотите:
- Используйте решение G2H: замените код GMS на код HMS напрямую. Хотя имя интерфейса HMS отличается от интерфейса GMS, значение интерфейсов такое же. Вы можете просто изменить имя интерфейса, обратившись к документации API.
- Используйте решение G+H: код уровня адаптации HMS+GMS добавляется к исходному логическому коду. Добавьте следующий код, чтобы определить, доступны ли API GMS или HMS, и вызвать доступные 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() вызывается через объект buyResultInfo, объявленный PurchaseResultInfo. Вы можете получить InAppPurchaseData после успешного вызова метода getInAppPurchaseData.
Идентификатор продукта текущей транзакции хранится в InAppPurchaseData. Смотрите: здесь.
@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). При попытке получить errorCode из ExceptionHandle я ничего не получаю.
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 в Cloud Debugging работает.
Что не так с моим кодом?