Пытаюсь встроить внутреннюю покупку в приложение. В общем по нажатии пункта меню из главного активити открывается DialogFragment в котором есть кнопка купить. Нажимаю эту кнопку первый раз - появляется платежное окно, в нем нажимаю купить, далее пишет что все отлично и ничего не происходит. Выхожу из приложения, захожу обратно – оно все равно в состоянии бесплатного, плюс к тому же когда пытаюсь нажать еще раз кнопку купить, то уже ничего не происходит и окно покупки не показывается. Что я делаю не так? Купить пытаюсь со своих двух аккаунтов на телефоне, вместо номера карты при покупке пишет "тестовая карта". Проблема из-за этого? Но почему на телефоне не сохраняется покупка? В гугл консоли она отмечается. Использую эту библиотеку https://github.com/serso/android-checkout
Код BuyFragment
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import org.solovyev.android.checkout.ActivityCheckout;
import org.solovyev.android.checkout.Billing;
import org.solovyev.android.checkout.Checkout;
import org.solovyev.android.checkout.EmptyRequestListener;
import org.solovyev.android.checkout.Inventory;
import org.solovyev.android.checkout.ProductTypes;
import org.solovyev.android.checkout.Purchase;
import javax.annotation.Nonnull;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import butterknife.BindView;
public class BuyFragment extends DialogFragment implements View.OnClickListener {
private Button btnBuy;
private TextView tvTitle, tvInfo;
private ActivityCheckout mCheckout;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_buy, container, false);
tvTitle = view.findViewById(R.id.tvTitle);
tvInfo = view.findViewById(R.id.tvInfo);
btnBuy = view.findViewById(R.id.btnBuy);
btnBuy.setOnClickListener(this);
final Billing billing = DoNotForgetApplication.get(getActivity()).getBilling();
mCheckout = Checkout.forActivity(getActivity(), billing);
mCheckout.start();
mCheckout.loadInventory(Inventory.Request.create().loadAllPurchases(), new BuyFragment.InventoryCallback());
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnBuy:
Log.i(Constants.INFO.TAG, "Нажата кнопка купить");
mCheckout.startPurchaseFlow(ProductTypes.IN_APP, Constants.INFO.SKUS_NAME, null, new PurchaseListener());
break;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
mCheckout.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onDestroy() {
mCheckout.stop();
super.onDestroy();
}
private void refreshFragment() {
Log.i(Constants.INFO.TAG, "Обновление интерфейса");
btnBuy.setVisibility(View.GONE);
tvTitle.setVisibility(View.GONE);
tvInfo.setText("Отлично! Теперь перезагрузите приложение.");
}
private class PurchaseListener extends EmptyRequestListener<Purchase> {
@Override
public void onSuccess(@Nonnull Purchase purchase) {
Log.i(Constants.INFO.TAG, "Приложение куплено");
Toast.makeText(getContext(), "Приложение куплено", Toast.LENGTH_SHORT).show();
refreshFragment();
}
}
// проверка покупки
private class InventoryCallback implements Inventory.Callback {
@Override
public void onLoaded(@Nonnull Inventory.Products products) {
final Inventory.Product product = products.get(ProductTypes.IN_APP);
if (!product.supported) {
Log.i(Constants.INFO.TAG, "Магазин поддерживается");
// billing is not supported, user can't purchase anything. Don't show ads in this case
return;
}
if (product.isPurchased(Constants.INFO.SKUS_NAME)) {
Log.i(Constants.INFO.TAG, "Приложение куплено");
} else
Log.i(Constants.INFO.TAG, "Приложение не куплено");
}
}
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
}
public void onCancel(@NonNull DialogInterface dialog) {
super.onCancel(dialog);
}
}
Код Application
public class DoNotForgetApplication extends Application {
@Nonnull
private final Billing mBilling = new Billing(this, new Billing.DefaultConfiguration() {
@Nonnull
@Override
public String getPublicKey() {
final String s = "здесь вставлен код с консоли";
return Encryption.decrypt(s, "world");
}
});
/**
* Returns an instance of {@link DoNotForgetApplication} attached to the passed activity.
*/
public static DoNotForgetApplication get(Activity activity) {
return (DoNotForgetApplication) activity.getApplication();
}
@Override
public void onCreate() {
super.onCreate();
mBilling.addPlayStoreListener(new PlayStoreListener() {
@Override
public void onPurchasesChanged() {
Toast.makeText(DoNotForgetApplication.this, "Play Store: purchases have changed!", Toast.LENGTH_LONG).show();
}
});
}
@Nonnull
public Billing getBilling() {
return mBilling;
}
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
В ходе работы приложения создаю папку и помещаю туда фото с камеры
У меня есть Maven проект на 2 модуляВо втором модуле я поставил Hibernate
Хотел бы узнать, как можно создать папку в папке, вызывая одну функцию