IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Implementer Android in-app billing pour la suppression de pub


Sujet :

Android

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 61
    Points : 41
    Points
    41
    Par défaut Implementer Android in-app billing pour la suppression de pub
    Bonjour à tous,

    J'ai intégré à mon application Android in-app billing dans le but de permettre à l'utilisateur de supprimer une bannière de publicité.

    Voici mon MainActivity.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
     
    private static final String TAG = "com.mypackage.inappbilling";
     
    public static final String ITEM_SKU = "test2";
     
    NavigationView navigationView = null;
    Toolbar toolbar = null;
    IabHelper mHelper;
     
     
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     
     
     
        //InAppBilling
     
        String base64EncodedPublicKey = "@string/base64";
        // compute your public key and store it in base64EncodedPublicKey
        mHelper = new IabHelper(this, base64EncodedPublicKey);
     
        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            @SuppressLint("LongLogTag")
            public void onIabSetupFinished(IabResult result) {
                if (!result.isSuccess()) {
                    // Oh no, there was a problem.
                    Log.d(TAG, "Problem setting up In-app Billing: " + result);
                }
                // Hooray, IAB is fully set up!
            }
        });
    }
     
     
    @Override
    protected void onActivityResult(int requestCode, int resultCode,
                                    Intent data)
    {
        if (!mHelper.handleActivityResult(requestCode,
                resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }
     
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
            = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result,
                                          Purchase purchase)
        {
            if (result.isFailure()) {
     
                // Handle error
                return;
            }
            else if (purchase.getSku().equals(ITEM_SKU)) {
                consumeItem();
     
            }
     
        }
    };
     
     
     
    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(ITEM_SKU),
                        mConsumeFinishedListener);
            }
     
        }
     
    };
     
    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
            new IabHelper.OnConsumeFinishedListener() {
                public void onConsumeFinished(Purchase purchase,
                                              IabResult result) {
     
                }
            };
     
     
     
    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
     
        if (id == R.id.nav_agenda) {
            //Set the fragment initially
     
            MainFragment fragment = new MainFragment();
     
            android.support.v4.app.FragmentTransaction fragmentTransaction =
                    getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
            // Handle the camera action
        } else if (id == R.id.nav_cadena) {
     
            mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001,
                    mPurchaseFinishedListener, "mypurchasetoken");
     
     
        } else if (id == R.id.nav_apropos) {
            //Set the fragment initially
            AproposFragment fragment = new AproposFragment();
            android.support.v4.app.FragmentTransaction fragmentTransaction =
                    getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
     
        } 
     
    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mHelper != null) mHelper.dispose();
        mHelper = null;
    }
    La fonction achat fonctionne bien , en test. Toutefois, je n'arrive pas à l'appliquer sur ma publicité afin de désactiver celle ci lorsque l'achat est réalisé. Ma publicité se trouve dans un fragment.

    MainFragment.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    public class MainFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
     
    SwipeRefreshLayout swipeLayout;
     
     
    public static AdView adView;
    private RecyclerView recyclerView;
    private View rootView;
     
     
     
     
    public MainFragment() {
     
    }
     
     
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_main, container, false);
     
        StartProgress();
        updateInterface();
     
     
     
        if (Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
     
     
        return rootView;
     
     
     
    }
     
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
     
     
     
     
     
     
     
        swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container);
        swipeLayout.setOnRefreshListener(this);
        swipeLayout.setColorSchemeColors(getResources().getColor(R.color.colorPrimary),
                getResources().getColor(R.color.colorPrimaryDark), getResources().getColor(R.color.colorAccent));
     
     
    }
     
     
     
     
    private void updateInterface() {
     
     
        if (purchase.getSku().equals(MainActivity.ITEM_SKU)) {
     
            displayAd(false);
        } else {
     
            displayAd(true);
        }
    }
     
     
     
     
    public void displayAd(boolean state) {
     
        if (state) {
            if (adView == null) {
     
                // Google has dropped Google Play Services support for Froyo
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
                    adView = (AdView) rootView.findViewById(R.id.adViewCardItem);
     
                    AdRequest adRequest = new AdRequest.Builder().build();
                    adView.loadAd(adRequest);
                }
            }
        } else {
     
     
            if (adView != null) {
                adView.destroy();
                adView = null;
            }
        }
    }
     
     
     
    @Override
    public void onRefresh() {
     
     
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
     
     
     
                swipeLayout.setRefreshing(false);
            }
        }, 2000);
     
     
    }
     
    public void StartProgress() {
        new AsyncProgressBar().execute();
    }
     
     
     
    private class AsyncProgressBar extends AsyncTask<Void, Void, Void> {
     
        protected ProgressDialog dialog;
     
        @Override
        protected void onPreExecute() {
            dialog = new ProgressDialog(getActivity());
            dialog.setMessage("...");
            dialog.setCancelable(false);
            dialog.show();
        }
     
        @Override
        protected Void doInBackground(Void... params) {
            //duration of progressbar
            SystemClock.sleep(1000);
     
            return null;
        }
     
     
     
        @Override
        protected void onPostExecute(Void useless) {
          .....
        }
    }
    Je bloque sur cette partie de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void updateInterface() {
     
     
        if (purchase.getSku().equals(MainActivity.ITEM_SKU)) {
     
            displayAd(false);
        } else {
     
            displayAd(true);
        }
    }
    Comment puis-je faire appel à la variable "purchase" de mon MainActivity.java ? Ou peut être n'est ce pas la bonne méthode ? Pouvez-vous s'il vous plaît m'éclairer sur ce point ?

    En vous remerciant par avance pour vos réponses.

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Tu ne peux pas.

    Je ne saisi pas bien ton workflow. Essaie de créer le Fragment directement avec la bonne information, ou de faire un callback depuis l'Activity vers le Fragment pour dire "affiche la pub (ou pas)" et laisse ensuite le Fragment réagir ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 61
    Points : 41
    Points
    41
    Par défaut
    Merci pour ta réponse. J'ai tenté effectivement également le callback depuis l'activité au fragment mais sans parvenir à mes fins.

    En fait, le code que j'ai publié n'est pas au complet puisqu'en réalité, mon fragment affiche une recyclerview utilisant un adapter, avec la fameuse bannière publicitaire en bas de la view. Je passe par un navigation drawer pour accéder à mon fragment. C'est pourquoi je déclare la publicité dans le fragment et non pas dans mon MainActivity.

    Mon bouton d'achat in-app fait également partie de mon navigation drawer, c'est pourquoi j'ai déclaré l'in-app billing dans mon main et non pas dans mon fragment.

    Ma solution de repli serait de créer un deuxième fragment sans la publicité, que j'appelle depuis mon MainActivity si l'achat est effectué, mais je ne suis pas certaine que ce soit la solution la plus correcte.

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Sans parvenir à tes fins ?

    Je vois un truc très basique de mon côté, avec la publicité qui est cachée par défaut dans ton Fragment. Une fois le retour obtenu, l'Activity prévient le Fragment et affiche ou non la vue en question (cachée par défaut pour éviter le redimensionnement "je la fais disparaître").
    Je ne peux pas le faire présentement sous la main (le singer avec un timer dans l'Activity). Je n'ai pas l'intuition que ça pose un quelconque problème par contre. Ca n'a rien donné, c'est ça ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    Je pense que le plus simple est de créer un booleen isPremium que tu initialises dans la méthode consumeItem() qui est apparemment la méthode appelé en cas de succès. Ainsi, dans consumeItem(), tu dis, isPremium =true, puis dans la méthode updateInterface(), tu vas chercher cette valeur.

    Après, pour moi l'achat in-app est sensé apporté de nouvelles données ou fonctionnalités. Comme il s'agit de supprimer la pub, je te conseillerai de créer une version pro de ton appli, donc allégée du code pub, voire avec d'autres fonctions. Ton bouton d'achat est alors simplement un lien vers la page Google play de ton appli pro. Et ca t'évite tout ce code d'achat in-app. L'inconvénient, c'est que tu dois dupliquer les mises à jour car tu te retrouve avec 2 appli

Discussions similaires

  1. [WM18] Mise en place In-App Purchase pour IOS et Android
    Par nico78 dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 18/07/2013, 22h30
  2. [ANDROID] In app billing v3 probleme
    Par Skahrz dans le forum Mobiles
    Réponses: 0
    Dernier message: 03/01/2013, 17h39
  3. Réponses: 0
    Dernier message: 25/10/2011, 10h07
  4. [C#] Probleme pour une suppression
    Par kenzo080 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 03/06/2004, 17h08
  5. Réponses: 8
    Dernier message: 14/11/2003, 22h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo