
О том, как непросто создать приложение с поддержкой In-App Purchase на хабре уже рассказывали (здесь и здесь), — слишком много кода для такой простой функциональности.
Даже поддержка оплаты через PayPal внедряется намного проще.
Но благодаря Robot Media SL и open-source библиотеки Android Billing Library, наша жизнь упрощается. Намного упрощается.
Рассмотрим пример как может выглядеть приложение, в котором есть платная функция — Убрать рекламу.
Прежде всего, Activity, в которой будет использована функция оплаты, должна расширять AbstractBillingActivity. В моем случае кнопка была добавлена в Настройки, потому пришлось чуть поправить этот класс, чтоб он сам расширял не Activity, а PreferenceActivity.
Сам код выглядит следующим образом:
public class Preferences extends AbstractBillingActivity {
public static final String ANDROID_MARKET_ITEM = "my_managed_item_id";
private boolean billingSupported = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
Preference buyPref = (Preference) findPreference("pref_billing_buy");
buyPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
// при нажатии на кнопку Убрать рекламу в настройках
public boolean onPreferenceClick(Preference preference) {
// проверяем поддерживается ли покупка в приложениях
if (checkBillingSupported() != BillingStatus.SUPPORTED) {
// показываем сообщение, что покупка не поддерживается
showDialog(DIALOG_BILLING_NOT_SUPPORTED_ID);
} else {
// проверяем не купил ли пользователь уже нашу опцию
Boolean purchased = BillingController.isPurchased(getApplicationContext(), ANDROID_MARKET_ITEM);
if (!purchased) {
// если не купил (или мы просто об этом пока не знаем? пользователь удалял
// приложение со всем данными?), то пытаемся восстановить транзакции
restoreTransactions();
// следующая строка (проверка еще раз не купил ли пользователь приложение) -
// не очень правильный подход - вызвав restoreTransactions,
// ответ мы получим не сразу
purchased = BillingController.isPurchased(getApplicationContext(), ANDROID_MARKET_ITEM);
if (!purchased) {
// наконец, показываем пользователю стандартное окно для покупки опции
requestPurchase(ANDROID_MARKET_ITEM);
}
}
}
return true;
}
});
@Override
public void onBillingChecked(boolean supported) {
billingSupported = supported;
}
@Override
public void onPurchaseCancelled(String itemId) {
Log.i(TAG, "Transaction has been cancelled: "+itemId);
}
// пользователь купил приложение, тут можно сделать нужные изменения в UI
@Override
public void onPurchaseExecuted(String itemId) {
Log.i(TAG, "User bought ad-free version: "+itemId);
CheckBoxPreference buyPref = (CheckBoxPreference) findPreference("pref_billing_buy");
buyPref.setEnabled(false);
}
@Override
public void onPurchaseRefunded(String itemId) {
Log.i(TAG, "Transaction has been refunded: "+itemId);
}
// библиотека сама шифрует наши данные, задаем здесь шифр
@Override
public byte[] getObfuscationSalt() {
return new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
}
// тут нужно вернуть ваш ключ
@Override
public String getPublicKey() {
return "my_key_is_here";
}
Просто? Очень просто.
Ну и на всякий случай опубликую свой код, чтоб правильно убрать рекламу (в моем случае — AdMob), чтоб она не просто была скрыта, но и не скачивалась:
Boolean purchased = BillingController.isPurchased(getApplicationContext(), Preferences.ANDROID_MARKET_ITEM);
if (purchased) {
LinearLayout adContainer = (LinearLayout) findViewById(R.id.bridges_list);
View admobAds = (View) findViewById(R.id.adView);
adContainer.removeView(admobAds);
}
Автор активно развивает библиотеку, прислушивается к пожеланиям, совсем недавно опубликовал исходники приложения с примером использования библиотеки.