الربح من التطبيقات – الجزء الثاني

تكلمنا في الجزء الاول من هذا الدرس عن الاعلانات وعن الربح منها وطريقة اضافتها في التطبيقات 

اليوم سنتكلم عن  In-app Billing  وهي خدمة بيع المحتويات داخل التطبيق مثلا لو كان تطبيقك يخص التصميم واردت بيع بعض الاضافات المدفوعة او شراء مرحلة جديدة من لعبة او اخفاء الاعلانات عن المستخدم وبامكانك ايضا استخدامها باي طريقة تريدها كخدمات اضافية للمستخدم .

تحتوي In-App Billing على نوعين :

  • Standard in-app products : وهذا يكون دفع مرة واحدة ويتملك المستخدم الخدمة .
  • Subscriptions : هذا يكون كاشتراك المستخدم شهريا في خدمة مدفوعة على كل شهر وذاتية التجديد.

سنقوم الان في البدء على الدرس ?.

  • انشئ مشروع جديد :

قم بانشاء مشروع جديد في اندرويد استديو .

  • تهيئة mainfest :

سنقوم باضافة هذا premmison الى AndroidMainFest.xml 

    <uses-permission android:name="com.android.vending.BILLING" />

من خلال السطر السابق قمنا بتهيئة التطبيق لعملية الشراء من داخل التطبيق .

اضافة ملفات الشراء :

اذهب الى مسار sdk في جهازك 

مسار sdk في جهازي على هذا المسار  /Users/ahmed/Library/Android/sdk

بعد ذلك سنذهب الى extras ثم google وسنجد مجلد باسم play_billing سندخل على المجلد ونقوم بنسخ كامل مجلد util ولصقه داخل التطبيق .

  • الحصول على LICENSE KEY :

قم باضافة تطبيق جديد في حسابك على play store 

لاتحتاج الى رفع apk الان فقط قم بانشاء تطبيق فارغ

 

 

Screen Shot 2015-09-11 at 3.17.02 PMبعد ذلك سنذهب الى Services & APIs كما في الصورة

Screen Shot 2015-09-11 at 3.18.00 PMالان ستجد في الصفحة LICENSING & IN-APP BILLING قم بنسخ الكود الذي يتكون من عدة اسطر :

Screen Shot 2015-09-11 at 3.17.41 PMالان انتهينا من google play 

ملاحظة : الى الان سنقوم باختبار التطبيق في DEBUG سنقوم بعد التجربة والتاكد من عمل التطبيق في رفعه على المتجر ونشره للمستخدمين ?

  • سنقوم بتصميم الواجهة الان :

اذهب الى ملف layout وقم باضافة الكود التالي :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main" tools:context=".MainActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/content"
        android:adjustViewBounds="true"
        android:src="@drawable/money"
        android:layout_alignParentTop="true"
        android:visibility="gone"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp" />

   
</RelativeLayout>

 

واجهة بسيطة تحتوي على :

  • FloatActionButton : لتنفيذ عملية الشراء .
  • ImageView : ستظهر بعد تنفيذ عملية الشراء .

ستكون الواجهة بهذ الشكل :

 

انتهينا من تصميم الواجهة .

  • اضافة IInAppBillingService.aidl الى المشروع :

هذا الملف مهم جدا في عملية الشراء ويجب التاكد انه يندرج تحت اسم الباكج التالي :

com.android.vending.billing

سنقوم بانشاءه بهذه الطريقة :

على ملف app اضغط بمؤشر الماوس الايمن كما في الصورة :

Untitled-1

بعد ذلك اضغط على finish .

الان وبعد ان قام باضافة الملف الخاص والمهم في عملية الشراء تبقى خطوة واحدة وهو اضافة داخل باكج نيم بهذا الاسم 

com.android.vending.billing

وستكون ملفات مشروعك مقاربة لما في الصورة .

Screen Shot 2015-09-11 at 5.06.30 PM

 

اذا وصلت الى هنا فانت قد قمت بجزء كبير من الشرح .

  • اضافة Google Play Billing في التطبيق :

في كلاس MainActivity سنحتاج الى تعريف FloatActionButton و ImageView مثل ماذكرنا فوق وليش اضفناهم .

public class MainActivity extends AppCompatActivity {
    ImageView content;
    FloatActionButton fab;
    //
    private static final String TAG =
            "tatbigy.inappbilling";
    IabHelper mHelper;
    //
    static final String ITEM_SKU = "android.test.purchased";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        //
        fab = (Button) findViewById(R.id.buy);
        content = (ImageView) findViewById(R.id.content);
        content.setEnabled(false);
        // copy YOUR LICENSE KEY FOR THIS APPLICATION from
        //https://play.google.com/apps/publish
        String base64EncodedPublicKey =
                "ضع هنا الkey الذي تم نسخه من google play";

        mHelper = new IabHelper(this, base64EncodedPublicKey);

        mHelper.startSetup(new
                                   IabHelper.OnIabSetupFinishedListener() {
                                       public void onIabSetupFinished(IabResult result) {
                                           if (!result.isSuccess()) {
                                               Log.d(TAG, "In-app Billing setup failed: " +
                                                       result);
                                           } else {
                                               Log.d(TAG, "In-app Billing is set up OK");
                                           }
                                       }
                                   });

نلاحظ قمنا باستدعاء class IabHelper وقمنا بعملية setup للشراء 

اذا قمت بتشغيل التطبيق الان ستلاحظ وجود “In-app Billing is set up OK” في logcat

تهيئة عملية الشراء :

الان نريد اذا ضغط المستخدم على  FloatActionButton شراء سيقوم التطبيق بتنفيذ العملية وايضا سنحتاج الى اضافة دالة onActivityResult حتى نعرف ان عملية الشراء نجحت او فشلت .

سنقوم الان باضافة هذه الاسطر داخل MainActivity :

String SKU = "android.test.purchased";
.
.
.
.
fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mHelper.launchPurchaseFlow(MainActivity.this, SKU, 10001,
                        mPurchaseFinishedListener, "ahmed");
            }
        });

نلاحظ اننا قمنا باستدعاء دالة launchPurchaseFlow واضفنا داخلها arguments وهي كالتالي :

  • this : وهذا يكون المرجع للـonActivityresult .
  • SKU : هذا id او المعرف للمنتج الذي سنقوم بشراءه وهنا قمنا باضافة Id للختبار قبل نشر التطبيق وبيعه بشكل حقيقي ويوجد العديد من SKU المتوفره لللاختبار قبل نشر التطبيق .

    android.test.cancelled, android.test.refunded and android.test.item_unavailable

  • قمنا باضافة رقم لعملية الطلب والنتيجة في onActivityResult 
  • دالة للتحقق من عملية اكتمال الشراء.
  • developer payload token وهنا يكون اي نص تقوم باضافته وقمنا باضافة “ahmed”.

 

  • اضافة دالة onActivityResult :

عند بدء دالة launchPurchaseFlow ستعود نتائج الشراء هنا .

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

دالة للتاكد من عملية الشراء :

سنقوم الان باضافة دالة للتاكد هل اكتملت عملية الشراء او لا وايضا سنقوم بالتاكد من SKU هل هو الذي قمنا بارسال الطلب له وايضا حتى لايقوم المستخدم بالشراء مره اخرى بحكم ان هذه العملية شراء وليست اشتراك ،

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
            = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result,
                                          Purchase purchase)
        {
            if (result.isFailure()) {
                // Handle error
                Toast.makeText(getApplicationContext(),result.toString(),Toast.LENGTH_LONG).show();
                return;
            }
            else if (purchase.getSku().equals(SKU)) {
                consumeItem();
                fab.setImageResource(R.drawable.ic_done_white_24dp);
                content.setVisibility(View.VISIBLE);
            }



        }
    };

الان سنقوم بالتاكد هل فعلا المستخدم قام بشراء هه الخدمة :

   public void consumeItem() {
        mHelper.queryInventoryAsync(mReceivedInventoryListener);
    }

    IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
            = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result,
                                             Inventory inventory) {
            if (result.isFailure()) {
                // Handle failure
            } else {
                mHelper.consumeAsync(inventory.getPurchase(SKU),
                        mConsumeFinishedListener);
            }
        }
    };

 

الان وبعد التأكد ان فلوسنا وصلتنا ? سنقوم بعرض الخدمة للمستخدم :

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
            new IabHelper.OnConsumeFinishedListener() {
                public void onConsumeFinished(Purchase purchase,
                                              IabResult result) {

                    if (result.isSuccess()) {
                        content.setVisibility(View.VISIBLE);
                    } else {
                        // handle error
                    }
                }
            };

 

الان ستكون النتيجة بهذا الشكل في الفيديو :

 

 

 

ملف المثال على gitHub هنا

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

3 أفكار عن “الربح من التطبيقات – الجزء الثاني”