예전 구독 기능을 구현할 땐 일일이 필요한 것들을 붙여서 했는데
현재는 인앱결제를 라이브러리로 만든 친절하고도 대단한 분이 계신다.
이번에는 구독이 아닌 광고 제거를 위한 1회성 결제가 필요한데 라이브러리를 사용해서 구현해보고자 한다.
당연한 얘기지만, 실제 기능을 만들기 위해 내가 해야 할 일이 매우, 매우 많이 줄어든다.
우선 해당 라이브러리가 소개된 github는 아래에 링크를 남겨두자.
https://github.com/anjlab/android-inapp-billing-v3
그럼 쉽게 쉽게 간단하게 간단하게 편하게 편하게 구현해볼까?
1. build.gradle에 다음을 추가한다.
implementation 'com.anjlab.android.iab.v3:library:1.0.44'
2. AndroidManifest.xml에 다음 퍼미션을 추가한다.
<uses-permission android:name="com.android.vending.BILLING" />
3. 해당 라이브러리 기능을 구현할 클래스를 하나 작성한다.
- 적어도 두 군데의 액티비티에서 사용할 것이므로 별도의 클래스로 만듦
public class BillingModule implements BillingProcessor.IBillingHandler {
private Context context;
private BillingProcessor mBillingProcessor;
public BillingModule(Context context) {
this.context = context;
}
public void initBillingProcessor() {
mBillingProcessor = new BillingProcessor(context, "rsa_key", this);
// 아래와 차이는 기트허브 페이지에서 확인할 수 있다. 상황에 맞게 사용하면 됨.
// mBilling Processor = BillingProcessor.newBillingProcessor(context, "rsa_key", this);
// rsa_key는 개발자 콘솔에서 제공하는 id
}
public void purchaseProduct() { // 아이템 구매 요청
if(mBillingProcessor.isPurchased(itemId)) {
// 이미 광고 제거를 위한 결제를 완료했기 때문에 해당 처리를 해주면 된다.
return;
}
mBillingProcessor.purchase((Activity)context, itemId);
}
public void releaseBillingProcessor() {
if(mBillingProcessor != null)
mBillingProcessor.release();
}
public BillingProcessor getBillingProcessor() {
return mBillingProcessor;
}
@Override
public void onProductPurchased(@NonNull String id, @Nullable TransactionDetails transactionDetails) {
// 아이템 구매 성공 시 호출.
// 따라서 보상을 지급하든(광고 제거) 혹은 해당 아이템을 소비하든 해당 기능을 작성
}
@Override
public void onPurchaseHistoryRestored() {
// 구매 내역 복원 및 구매한 모든 PRODUCT ID 목록이 Google Play에서 로드 될 때 호출.
}
@Override
public void onBillingError(int errCode, @Nullable Throwable throwable) {
// 구매 시 에러가 발생했을 때 처리
if(errCode != com.anjlab.android.iab.v3.Constants.BILLING_RESPONSE_RESULT_USER_CANCELED) {
// 사용자가 취소한 게 아니라면 에러 발생에 대해 사용자에게 고지하는 등의 처리
}
}
@Override
public void onBillingInitialized() {
// 개발자 콘솔에서 등록한 아이템 아이디
SkuDetails mProduct = mBillingProcessor.getPurchaseListingDetails("remove_ad");
if(mProduct == null)
return;
itemId = mProduct.productId;
mBillingProcessor.loadOwnedPurchasesFromGoogle(); // 소유하고 있는 구매 아이템 목록을 가져온다.
if(mBillingProcessor.isPurchased(mProduct.productId) {
// 이미 광고 제거를 구매했다면 다시 구매할 필요가 없으므로
// 해당 부분 처리. 또는 이미 구매 시 광고 제거 구매를 애초에 막는다.
}
}
}
4. 필요한 클래스에서 해당 기능을 수행.
public class SplashActivity extends Activity {
BillingModule billingModule;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
billingModule = new BillingModule(this);
billing.initBillingProcessor();
// 광고 제거 구매 내역이 있는지 확인 후, 있다면 배너 광고나 전면 광고가 보이지 않도록 처리한다.
...
}
@Override
protected void onDestroy() {
super.onDestroy();
billingModule.releaseBillingProcessor();
}
}
광고 제거를 구매할 수 있는 액티비티에서는 다음을 수행해준다.
public class PurchaseActivity extends Activity {
private BillingProcessor mBillingProcessor;
private BillingModule billingModule;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
billingModule = new BillingModule(this);
billingModule.initBillingProcessor();
mBillingProcessor = billingModule.getBillingProcessor();
...
}
...
private void purchaseProduct() { // 아이템 구매 요청
billingModule.purchaseProduct();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(mBillingProcessor.handleActivityResult(requestCode, resultCode, data)) {
if(resultCode == RESULT_OK) {
아이템 구매가 성공했을 경우 처리
}
}
}
}
이 라이브러리를 만들어주신 분에게 진심으로 감사드리며..까먹지 말자 ^.,^
'안드로이드' 카테고리의 다른 글
안드로이드 FCM 푸시 알림 구현 (0) | 2018.12.10 |
---|---|
Suppressing toast from package ... (0) | 2018.11.27 |
drawable 경로를 문자열로 가져오기 (0) | 2018.10.26 |
vibrate() is deprecated (0) | 2018.08.16 |
Volley 사용하여 게시판 리스트 가져와서 출력하기 3/3 (0) | 2018.08.01 |