Как реализовать получение результата Android In-app billing в fragment?

159
07 ноября 2018, 15:40

Не могу разобраться уже несколько дней. Как реализовать получение результата Android In-app billing в fragment? При совершении тестовой оплаты (после успешной оплаты покупки) ничего не происходит с первого раза, при клике второй раз (и последующие) на кнопку купить успешно выполняется действие из метода onProductPurchased. Почему действие после успешной покупки не выполняется с первого раза и как это решить? Все операции с биллингом происходят внутри фрагмента. Перечитал кучу информации в интернете и подобные вопросы, но не понял как решить эту проблему. Надеюсь на вашу помощь.

Мой код:

// Инициализация и кнопка в onCreateView
bp = new BillingProcessor(context, "Мой ключ", this);
bp.initialize();
// Клик по кнопке для оплаты
PayButt.setOnClickListener(
                                new View.OnClickListener() {
                                    public void onClick(View v) {
                                            // Выполняем оплату
                                            bp.purchase((Activity) context, ProductID);
                                    }
                                }
                        );
// Инициализация и кнопка в onCreateView
// Стандартные методы
// Оплата
@Override
public void onBillingInitialized() {
    /*
     * Вызывается, когда объект инициализирован и можно совершать покупки
     */
}
@Override
public void onProductPurchased(@NonNull String productId, TransactionDetails details) {
    /*
     * Вызывается когда покупка совершена
     */
    if (bp.isPurchased(productId)) {
       Toast toastTrue = Toast.makeText(context, "Оплата выполнена успешно!", Toast.LENGTH_SHORT);
                    toastTrue.show();
                    // Переходим на главную
                    Intent intent = new Intent(getActivity(), MainController.class);
                    startActivity(intent);
    }
}
@Override
public void onBillingError(int errorCode, Throwable error) {
    /*
     * Вызывается при возникновении каких-либо ошибок при совершении покупки
     */
}
@Override
public void onPurchaseHistoryRestored() {
    /*
     * Вызывается один раз при первом запуске после установки или переустановки приложения.
     * Служит для получения приобретённых ранее покупок, например, на другом устройстве
     */
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (!bp.handleActivityResult(requestCode, resultCode, data)) {
        super.onActivityResult(requestCode, resultCode, data);
    }
}
Answer 1

Проблема решена. Я уже пытался решить ее таким способом, но вставлял данный код не туда. Необходимо чтобы и в основном Activity был метод onActivityResult, который передавал данные в onActivityResult фрагмента. Код onActivityResult из основного Activity:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments())
    {
        if (fragment != null)
        {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}
READ ALSO
Хранение файлов на сервере java

Хранение файлов на сервере java

Загружаю файл на сервер java

189
Почему @RequestParam отсутствует

Почему @RequestParam отсутствует

есть метод который вернет ответы с помощью id

215
Как создать массив с буквами кириллицы в Java?

Как создать массив с буквами кириллицы в Java?

При создании массива с русскими символами компилятор выдаёт такую ошибку(смизображение)

187