Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Библиотека Android In-App Billing v3 Library

#android #in_app_purchases


Реализовал в своем приложении отключение рекламы на базе библиотеки с GitHub: "anjlab/android-inapp-billing-v3".

public class HelpActivity extends Activity implements BillingProcessor.IBillingHandler{
    ScrollView scrollView;


    TextView mTextView;
    BillingProcessor bp;
    static final String Off_ADVERTISING = "off_advertising";
    String fileName = "data";
    boolean m_off_advertising = false;
    SharedPreferences sPref;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_help);
        // Убираем панель уведомлений
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        scrollView = (ScrollView)findViewById(R.id.scrollView);


        try {
            readFileXML();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mTextView = (TextView)findViewById(R.id.textView11);

//        String licenseKey = getResources().getString(R.string.license_key);
//        bp = new BillingProcessor(this, licenseKey, this);
        bp = new BillingProcessor(this, null, this);

        mTextView.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("ShowToast")
            @Override
            public void onClick(View v) {
               // bp.purchase(HelpActivity.this, "off_advertising");
                bp.purchase(HelpActivity.this, "android.test.purch");
            }
        });
        if(m_off_advertising){
            //показываем рекламу
            mTextView.setText("не показываем рекламу");

        }
    }

    @Override
    public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails
details) {

        mTextView.setText("Реклама убрана");
        m_off_advertising = true;
        saveData();
    }

    @Override
    public void onPurchaseHistoryRestored() {

//        mTextView.setText("Реклама восстановлена");
//        m_off_advertising = true;
//        saveData();
    }

    @Override
    public void onBillingError(int errorCode, @Nullable Throwable error) {

    }

    @Override
    public void onBillingInitialized() {

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (!bp.handleActivityResult(requestCode, resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

    @Override
    protected void onPause() {
        saveData();
        super.onPause();
    }

    @Override
    protected void onResume() {

        try {
            readFileXML();
        } catch (IOException e) {
            e.printStackTrace();
        }

        super.onResume();
    }

    @Override
    public void onDestroy() {
        saveData();
        if (bp != null) {
            bp.release();
        }
        super.onDestroy();
    }


    void readFileXML() throws IOException {
        this.sPref = getSharedPreferences(this.fileName, 0);
        this.m_off_advertising = this.sPref.getBoolean(Off_ADVERTISING, false);

    }


    void saveData() {
        //Log.d(TAG, "m_off_advertising save " + this.m_off_advertising);
        this.sPref = getSharedPreferences(this.fileName, 0);
        SharedPreferences.Editor ed = this.sPref.edit();
        ed.putBoolean(Off_ADVERTISING, this.m_off_advertising);
        ed.commit();
    }


}


Но есть 2 но:
Первое: 
После покупки, нужно ещё раз нажать на текст купить, чтобы покупка отобразилась.
Второе:
Метод восстановления срабатывает всегда, и выполняет всё что в нём написано, не проверяя
id продукта

 @Override
    public void onPurchaseHistoryRestored() {

//        mTextView.setText("Реклама восстановлена");
//        m_off_advertising = true;
//        saveData();
    }


Как можно сделать проверку при включении и восстановлении для определённого продукта? 
    


Ответы

Ответ 1



Как я у себя реализовал отключение рекламы в приложении с применением библиотеки Android In-App-Billing-v3 от AnjLab? файл build.gradle модуля /app dependencies { // Ваши всевозможные библиотеки // ... compile 'com.anjlab.android.iab.v3:library:1.0.44' // ... // Ваши всевозможные библиотеки compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' } следите за последней release версией библиотеки, если нет возможности заходить на GitHub страничку и выписывать номер версии оттуда, то можно сделать следующее: compile 'com.anjlab.android.iab.v3:library:+' данная строчка будет выделена Android Studio, ставим курсор слева от + Жмем Alt + Enter, выбираем Replace with specific version Идем дальше ... класс SettingsFrag Мое приложение работает по принципу "В одной Activity отображаю все Fragment'ы." package com.my_best_of_the_best_application_name.ui.fragment; // список **import**'ов ... public class SettingsFrag extends Fragment implements BillingProcessor.IBillingHandler { private boolean adsStatus; // храним текущий статус отображения рекламы private boolean initialize; // храним готовность к покупкам private BillingProcessor bp; // переменная нашего процессора private PreferencesManager prefManager; // класс, который работает с SharedPreferences. Я для себя решил вынести всю логику отдельно private Resources resources; // для работы с ресурсами. Раз получаем и постоянно обращаемся private ToggleButton tbAdsState; // кнопка @Override public void onAttach(Context context) { super.onAttach(context); this.mContext = context; bp = new BillingProcessor(context, InAppBillingResources.getRsaKey(), InAppBillingResources.getMerchantId(), this); // инициализируем `BillingProcessor`. В документации на `GitHub` сказано, что для защиты от липовых покупок через приложения типа `freedom` необходимо в конструктор `BillingProcessor`'а передать еще и свой `MERCHANT_ID`. Где его взять - внизу текущего ответа опишу шаги prefManager = new PreferencesManager(context); // класс, который работает с `SharedPreferences` adsStatus = prefManager.getAdsStatus(); // получаем из `SharedPreferences` сохраненное состояние рекламы (ВКЛ / ВЫКЛ) resources = context.getResources(); // получаем "доступ" к ресурсам } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // создаем `View` экрана настроек View settView = inflater.inflate(R.layout.frag_sett_screen, container, false); // инициализация других полей tbAdsState = (ToggleButton) settView.findViewById(R.id.tbAdsState); // инициализация других полей // вешаем слушателя нажатий по кнопке `ToggleButton` tbAdsState.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // `adsStatus` : getAdsStatus из класса `PreferencesManager` // true - enabled (ВКЛ) | false - disabled (ВЫКЛ) if (adsStatus && initialize) { bp.purchase(getActivity(), InAppBillingResources.getSKU_Disable_Ads()); } if (!adsStatus) { tbAdsState.setChecked(false); Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.txt_ads_is_already_disabled), Toast.LENGTH_LONG).show(); } } }); return settView; } @Override public void onResume() { super.onResume(); tbAdsState.setChecked(prefManager.getAdsStatus()); } // диалог, который скажет пользователю, что после покупки необходимо перезагрузиться private void restartDialog() { AlertDialog.Builder builder; View alertLayout = View.inflate(mContext, R.layout.dialog_restart, null); builder = new AlertDialog.Builder(mContext, R.style.AppThemeDialogStyleDark); builder.setTitle(resources.getString(R.string.msg_notification_Title)); builder.setView(alertLayout); builder.setCancelable(false); builder.setPositiveButton(resources.getString(R.string.ans_restart), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { restartApp(); } }); builder.show(); } // перезагружаем приложение private void restartApp() { Intent rIntent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()); if (rIntent != null) { rIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); mContext.startActivity(rIntent); } } // ... другие методы класса // [START billing part of class] @Override public void onProductPurchased(@NonNull String productId, TransactionDetails details) { // Called when requested PRODUCT ID was successfully purchased // Вызывается, когда запрашиваемый PRODUCT ID был успешно куплен if (bp.isPurchased(productId)) { prefManager.setAdsStatus(false); // 1. записываем в `SharedPreferences` состояние рекламы (ВЫКЛ / false) tbAdsState.setChecked(false); // 2. устанавливаем `TogglButton` в соответствующее состояние restartDialog(); // 3. перезагружаем приложение } else { tbAdsState.setChecked(true); // иначе, если не прошла покупка, оставляем состояние (ВКЛ / true) } } @Override public void onPurchaseHistoryRestored() { //Вызывается, когда история покупки была восстановлена, // и список всех принадлежащих идентификаторы продуктов был загружен из Google Play // случай #2 (см. ниже) } @Override public void onBillingError(int errorCode, Throwable error) { // Вызывается, когда появляется ошибка. См. константы класса // для получения более подробной информации } @Override public void onBillingInitialized() { // Вызывается, когда bp был инициализирован и он готов приобрести initialize = true; } // [END billing part of class] } класс InAppBillingResources public class InAppBillingResources { private static final String RSA_KEY = "GFGFD156GF1SDF1.... FDS156DS"; // Ваш `RSA` ключ из `Google Play Developer Console` private static final String MERCHANT_ID = "16..1511.5..82"; // Ваш `MERCHANT_ID` из `Google Play Developer Console` private static final String SKU_DISABLE_ADS = "disable_ads"; // Ваш `product_id`, создается в `Google Play Developer Console` public static String getRsaKey() { return RSA_KEY; } public static String getMerchantId() { return MERCHANT_ID; } public static String getSKU_Disable_Ads() { return SKU_DISABLE_ADS; } } класс PreferencesManager public class PreferencesManager { private static SharedPreferences mSPref; private SharedPreferences.Editor mSPEditor; private static final String APP_PREF = "app_pref"; // имя файла настроек Вашего приложения private static final String APP_ADS_STATUS = "adsStatus"; // статус рекламы public PreferencesManager(Context context) { mSPref = context.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE); } public void setAdsStatus(boolean adsStatus) { // true - enabled | false - disabled mSPEditor = mSPref.edit(); mSPEditor.putBoolean(APP_ADS_STATUS, adsStatus); mSPEditor.apply(); } public boolean getAdsStatus() { return mSPref.getBoolean(APP_ADS_STATUS, true); } } Дополнительная полезная информация Где взять в Google Play Developer Console свой RSA ключ - Читать Google Справку Где взять в Google Play Developer Console свой MERCHANT_ID - Читать Google Справку Метод восстановления. Вы можете реализовать восстановление покупок на стартовом activity приложения. Код инициализации BillingProcessor такой же. Метод onPurchaseHistoryRestored ниже @Override public void onPurchaseHistoryRestored() { //Вызывается, когда история покупки была восстановлена, // и список всех принадлежащих идентификаторы продуктов был загружен из Google Play // так Вы сможете НУЖНУЮ покупку проверить for (String sku : bp.listOwnedProducts()) { MyAppLogs.show("Owned Managed Product: " + sku); boolean wasBouhtg = sku.equals(InAppBillingResources.getSKU_Disable_Ads()); if (wasBouhtg) { // true - куплено // пишем в `SharedPreferences`, что отключили рекламу } else { // false - не куплено // пишем в `SharedPreferences`, что нужно показывать рекламу } } } // Если где-то я что-то упустил, сообщите, пожалуйста, в комментарии к моему ответу

Комментариев нет:

Отправить комментарий