1. Mitglieder surfen ohne Werbung auf Android-Hilfe.de! ✔ Jetzt kostenlos Mitglied in unserer Community werden.
  1. tefracky, 11.03.2018 #1
    tefracky

    tefracky Threadstarter App-Anbieter (kostenlos)

    Hallo,

    mir ist bewusst, dass es zu diesem Thema schon unzählige verschiedene Foreneinträge gibt, aber ich bekomme es trotzdem nicht hin...

    Ich möchte gerne einen Knopf zum Spenden in meine App einbauen, also nach dem Motto: Hier drück zum Spenden von 1€.

    Folgendes ist bisher passiert:
    Den InApp Kauf in der Developer-Konsole angelget ("spenden_1")
    compile 'com.android.billingclient:billing:1.0' zur build.gradle hinzugefügt

    BillingerManager.class und BillingProvider.class aus einem Beispielprojekt kopiert und angepasst:

    Code:
    /*
    * Copyright 2017 Google Inc. All Rights Reserved.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    package com.codelab.billing;
    
    import android.app.Activity;
    
    import com.android.billingclient.api.BillingFlowParams;
    import com.android.billingclient.api.PurchasesUpdatedListener;
    import android.util.Log;
    
    import com.android.billingclient.api.BillingClient.BillingResponse;
    import com.android.billingclient.api.BillingClient.SkuType;
    import com.android.billingclient.api.BillingClient;
    import com.android.billingclient.api.BillingClientStateListener;
    import com.android.billingclient.api.Purchase;
    import com.android.billingclient.api.SkuDetails;
    import com.android.billingclient.api.SkuDetailsParams;
    import com.android.billingclient.api.SkuDetailsResponseListener;
    
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    
    /**
    * BillingManager that handles all the interactions with Play Store
    * (via Billing library), maintain connection to it through BillingClient and cache
    * temporary states/data if needed.
    */
    public class BillingManager implements PurchasesUpdatedListener {
        private static final String TAG = "BillingManager";
    
        private final BillingClient mBillingClient;
        private final Activity mActivity;
    
        // Defining SKU constants from Google Play Developer Console
        private static final HashMap<String, List<String>> SKUS;
        static
        {
            SKUS = new HashMap<>();
            SKUS.put(SkuType.INAPP, Arrays.asList("spenden_1"));
        }
    
        public BillingManager(Activity activity) {
            mActivity = activity;
            mBillingClient = BillingClient.newBuilder(mActivity).setListener(this).build();
            startServiceConnectionIfNeeded(null);
        }
    
        @Override
        public void onPurchasesUpdated(int responseCode, List<Purchase> purchases) {
            Log.i(TAG, "onPurchasesUpdated() response: " + responseCode);
        }
    
        /**
         * Trying to restart service connection if it's needed or just execute a request.
         * <p>Note: It's just a primitive example - it's up to you to implement a real retry-policy.</p>
         * @param executeOnSuccess This runnable will be executed once the connection to the Billing
         *                         service is restored.
         */
        private void startServiceConnectionIfNeeded(final Runnable executeOnSuccess) {
            if (mBillingClient.isReady()) {
                if (executeOnSuccess != null) {
                    executeOnSuccess.run();
                }
            } else {
                mBillingClient.startConnection(new BillingClientStateListener() {
                    @Override
                    public void onBillingSetupFinished(@BillingResponse int billingResponse) {
                        if (billingResponse == BillingResponse.OK) {
                            Log.i(TAG, "onBillingSetupFinished() response: " + billingResponse);
                            if (executeOnSuccess != null) {
                                executeOnSuccess.run();
                            }
                        } else {
                            Log.w(TAG, "onBillingSetupFinished() error code: " + billingResponse);
                        }
                    }
    
                    @Override
                    public void onBillingServiceDisconnected() {
                        Log.w(TAG, "onBillingServiceDisconnected()");
                    }
                });
            }
        }
    
        public void querySkuDetailsAsync(@BillingClient.SkuType final String itemType,
                final List<String> skuList, final SkuDetailsResponseListener listener) {
            // Specify a runnable to start when connection to Billing client is established
            Runnable executeOnConnectedService = new Runnable() {
                @Override
                public void run() {
                    SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
                            .setSkusList(skuList).setType(itemType).build();
                    mBillingClient.querySkuDetailsAsync(skuDetailsParams,
                            new SkuDetailsResponseListener() {
                                @Override
                                public void onSkuDetailsResponse(int responseCode,
                                        List<SkuDetails> skuDetailsList) {
                                    listener.onSkuDetailsResponse(responseCode, skuDetailsList);
                                }
                            });
                }
            };
    
            // If Billing client was disconnected, we retry 1 time and if success, execute the query
            startServiceConnectionIfNeeded(executeOnConnectedService);
        }
    
        public List<String> getSkus(@SkuType String type) {
            return SKUS.get(type);
        }
    
        public void startPurchaseFlow(final String skuId, final String billingType) {
            // Specify a runnable to start when connection to Billing client is established
            Runnable executeOnConnectedService = new Runnable() {
                @Override
                public void run() {
                    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                            .setType(billingType)
                            .setSku(skuId)
                            .build();
                    mBillingClient.launchBillingFlow(mActivity, billingFlowParams);
                }
            };
    
            // If Billing client was disconnected, we retry 1 time and if success, execute the query
            startServiceConnectionIfNeeded(executeOnConnectedService);
        }
    
        public void destroy() {
            mBillingClient.endConnection();
        }
    }

    Code:
    /*
     * Copyright 2017 Google Inc. All Rights Reserved.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package com.codelab.billing;
    
    /**
     * An interface that provides an access to Billing Library methods
     */
    public interface BillingProvider {
        BillingManager getBillingManager();
    }

    Was muss ich nun aber tun, damit bei meinem Button "1€ spenden" auch der Task aufgerufen wird? Was muss sonst noch in der MainActivity implementiert werden und wie kann ich den Kauf überprüfen/absichern bzw. herauszufinden, ob schon ein Kauf getätigt wurde?

    BillingManager.startPurchaseFlow("spenden_1", "INAPP"); funktioniert leider nicht, da die Methode nonstatic ist.

    Im Gegensatz zum Beispiel hier (Buy and Subscribe: Monetize your app on Google Play) muss die In-App-Käufe Liste nicht abgerufen und dargestellt werden, das passiert in der App selbst.

    Es geht nur Folgendes:

    Beim Start der App testen, ob ein Kauf getätigt wurde.
    Beim Drücken auf den Knopf einen Kauf tätigen.
    Sonstige Implementationen zur Absicherung, wenn diese denn benötigt werden sollten.

    Kann mir jemand helfen?

    Viele Grüße

    Tefracky
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
Daten für eine Stundenplan-App Android App Entwicklung Mittwoch um 13:18 Uhr
App wird nach start sofort beendet! Android App Entwicklung Montag um 12:37 Uhr
Service stoppt wenn App geschlossen wird Android App Entwicklung 16.05.2018
Daten von Android Wear zur Handy-App senden geht nicht Android App Entwicklung 03.04.2018
Benötigte Zugriff ausschalten Android App Entwicklung 07.03.2018
App-Aktualisierungen richtig testen und an den User bringen. Android App Entwicklung 03.03.2018
Warum Stürtzt meine App ab? (Beim Öffnen von content_3) Android App Entwicklung 27.02.2018
Data Message von Firebase an die App senden Android App Entwicklung 18.02.2018
Eigene Web DB für App Inventor Android App Entwicklung 10.02.2018
Telefon-App Nummerntöne Android App Entwicklung 06.02.2018
  1. Android-Hilfe.de verwendet Cookies um Inhalte zu personalisieren und dir den bestmöglichen Service zu gewährleisten. Wenn du auf der Seite weitersurfst stimmst du der Cookie-Nutzung zu.  Ich stimme zu.