Миграция из Google Play Store в Huawei Store. Какие-нибудь изменения в коде?

У меня есть приложение в Google Play Store. Планирую опубликовать его также в магазине Huawei.

Помимо повторной сборки приложения с использованием SDK Huawei и основных инструкций (добавить в проект agconnect-services.json и т. Д.), Есть ли что-то еще, что нужно изменить на уровне кода?

Все ли API работают? Особенно те, которые связаны с покупками в приложении?

благодаря

2 ответа

Решение

Во-первых, проверьте, какой комплект GMS вы используете, и я могу предоставить вам соответствующие комплекты HMS. Вы также можете обратиться к этому ответу.

На уровне кода, если вы хотите:

  1. Используйте решение G2H: замените код GMS на код HMS напрямую. Хотя имя интерфейса HMS отличается от интерфейса GMS, значение интерфейсов такое же. Вы можете просто изменить имя интерфейса, обратившись к документации API.
  2. Используйте решение 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 работает.

Что не так с моим кодом?

Другие вопросы по тегам