Android In App Purchase Einkäufe gutschreiben

wer112

Top Contributor
Ich habe ein einfache Test App erstellt mit drei Buttons und möchte, wenn man auf den Button klickt, wird der Kaufvorgang eingeleitet. Wenn der Kaufvorgang fertig ist, wird das "Produkt" gutgeschrieben. Ich habe dafür ein Youtub Video angeschaut und für meine Verhältnisse umgeschrieben, da er was anderes machen wollte.

Ich habe 2 Probleme und hoffe, ihr könnt mir helfen.

Problem 1:

- Wenn ich auf dem Button klicke wird das Produkt gutgeschrieben und erst dann geht der Kaufvorgang los. Wie mache ich es, das erst der KAufvorgang kommt und wenn alles stimmt, das "Produkt" gutgeschrieben wird? Es bringt ja nicht, wenn man "umsonst" Produkte bekommt.

Problem 2:

- Ich bin Test Nutzer im Interner Test, aber wenn ich das Produkt kaufen möchte, für den Test, bekomme ich keine Test Card zum bezahlen. Wiso bekomme ich als Tester keine Test Card? Ich kann ja nicht mehrere hundert Euros ausgeben, nur fürs testen.

Ich hoffe, dass mir hier sehr gut geholfen wird. Dann können andere, die das selbe Problem haben, wissen, wie es geht.



Ich werde den Code als Open Source für die Community anbieten...

PS.: Ich mache das zum erstenmal so richtig....

Ich danke schon mal im Vorfeld!

Hier die Codes:



[CODE lang="java" title="MainActivity.class"]package com.............;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;

public class MainActivity extends AppCompatActivity implements BillingProcessor.IBillingHandler {

private BillingProcessor bp;

private TextView coinText;

private Button btn1, btn2, btn3;

private int coins = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

SharedPreferences prefsnetzeinstellung = getSharedPreferences("Coins", MODE_PRIVATE);
coins = prefsnetzeinstellung.getInt("coins", coins);

coinText = findViewById(R.id.textView);
coinText.setText(coins + " Coins");


btn1 = findViewById(R.id.button);
btn2 = findViewById(R.id.button2);
btn3 = findViewById(R.id.button3);

bp = new BillingProcessor(this, getResources().getString(R.string.play_console_license), this);
bp.initialize();


}


@Override
public void onBillingInitialized() {

btn1.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(this, "button1");
coins += 2;
SharedPreferences prefs = getSharedPreferences("Coins", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("coins" , coins);
editor.apply();
coinText.setText(coins + " Coins");
}else{

}
});

btn2.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(this, "button2");
coins += 5;
SharedPreferences prefs = getSharedPreferences("Coins", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("coins" , coins);
editor.apply();
coinText.setText(coins + " Coins");
}else{

}
});


btn3.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(this, "button3");
coins += 8;
SharedPreferences prefs = getSharedPreferences("Coins", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("coins" , coins);
editor.apply();
coinText.setText(coins + " Coins");
}else{

}
});


}

@Override
public void onProductPurchased(String productId, TransactionDetails details) {

}

@Override
public void onPurchaseHistoryRestored() {

}

@Override
public void onBillingError(int errorCode, Throwable error) {

}

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

@Override
public void onDestroy() {
if (bp != null){
bp.release();
}
super.onDestroy();
}
}[/CODE]


[CODE lang="java" title="build.gradle(app)"]plugins {
id 'com.android.application'
}

android {
compileSdkVersion 30
buildToolsVersion "30.0.3"

defaultConfig {
applicationId "........."
minSdkVersion 21
targetSdkVersion 30
versionCode 4
versionName "4.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {

implementation 'com.anjlab.android.iab.v3:library:1.0.44'

def billing_version = "4.0.0"

implementation "com.android.billingclient:billing:$billing_version"

implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}[/CODE]
 

Jw456

Top Contributor
Hallo also die onClick Lister würde ich erstmal in der onCreate erstellen nicht in der onBillingInitialized(). Keine Ahnung wann genau die Methode aufgrufen wird.

Du willst ja das die Button nach dem Aufbau des Layouts aktiv sind.

Nach dem Start des Kaufes kommst du doch sicherlich in der onActivityResult Methode an. Furt solltest du bei erfolgreichen Kauf auch deine choins und deine Shprefs setetzen.
Nicht gleich nach dem du die kauf app gestartet hast.
 

wer112

Top Contributor
Hallo also die onClick Lister würde ich erstmal in der onCreate erstellen nicht in der onBillingInitialized(). Keine Ahnung wann genau die Methode aufgrufen wird.

Du willst ja das die Button nach dem Aufbau des Layouts aktiv sind.

Nach dem Start des Kaufes kommst du doch sicherlich in der onActivityResult Methode an. Furt solltest du bei erfolgreichen Kauf auch deine choins und deine Shprefs setetzen.
Nicht gleich nach dem du die kauf app gestartet hast.
1. Ich verstehe grade nur Bahnhof.
2. Wie mache ich das?
3. Könntest du das ändern, damit es funktioniert? Es muss ja für 3 verschiedene Buttons sein...


4. Was ist jetzt mit der Test Card?
 

Jw456

Top Contributor
Eigentlich müsstest du nach dem Kauf auch in die onProductPurchased Methode kommen in der du prüfen kannst ob der Kauf erfolgreich war und was gekauft wurde.
 

wer112

Top Contributor
Eigentlich müsstest du nach dem Kauf auch in die onProductPurchased Methode kommen in der du prüfen kannst ob der Kauf erfolgreich war und was gekauft wurde.
Und wie macht man das? Ich habe da keine Ahnung, wie sowas funktioniert. Kannst du das nicht entsprechend ändern bzw. mir sagen, wo ich das "Gutschreiben" muss, nach dem kauf(Also an welche Stelle es stehen muss.....

Und das mit der Test Card???
 

Jw456

Top Contributor
Ich Persönlich nutze in App kauf nicht.

Wo du deine Produkte gut schreiben musst habe ich dir gesagt.
In der onProductPurchased Methode dort bekommst du auch die TransactionDetail mit denen du prüfen können solltest ob der kauf erfolgreich war.

Das wird auch In dem Video was du benutzt hast so sein.
 
K

kneitzel

Gast
Von mir wäre da die Anregung, dass du das, was du bereits erstellt hast und das so Probleme macht, einfach mal auf Github oder so bereit stellst. Dann wird es einfacher, Anpassungen vorzuschlagen.

Aber ob dann jemand so Anpassungen vornehmen wird, ist natürlich immer noch offen - aber die Schwelle wird geringer, wenn man sich das direkt ansehen und anpassen kann in der IDE.
 

wer112

Top Contributor
Ich habe mir das angesehen und leider festgestellt, das es alles bisher nicht funktionieren würde. Mir hätte sonst ca. ab 15 gefallen. Die arbeiten nicht mit mehrere Buttons. Hätte man nur ein Button, dann würde es anderes aussehen.
 

Jw456

Top Contributor
Ob es ein oder mehrere Button sind ist doch ersrstmal egal. Wenn der Kauf beendet ist kommst du immer in der gleichen Methode an.
Du scheinst das Prinzip vom callback oder listener nicht verstanden zu haben.
Sehe ich auch daran das du dich schon schwer tust einen Button mit listener in der onCreate zu erstellen.

Wenn du verstanden hast wie es mit einen Button geht ist es doch einfach mehrere anzubieten. In jedem Button bei jedem bp.purchase(this, "button2");
Übergibt du doch einen Strings mit dem du auch in der callback Methode nach dem Kauf prüfen kannst von wo der Aufruf kommt. Um auch estrechend deine Variablen zu setzten also ob 2 5 oder 10 Münzen gekauft wurden.
onProductPurchased(String productId, details) {
Schau dich mal was in dem string ist ob das dein übergebner Strings ist.

Dann schaue in die Doku wie TransactionDetails aufgebaut ist und was in ihr alles gespeichert sein kann.

PS wenn du 10 Button hast dein Ergebnis kommt immer in der gleichen Methode an.
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Mal eine Frage findet den überhaupt der Verkauf statt? Würdest du auch das, Geld bekommen?
Erstmal egal ob der user seine gekauften coins von dir in der App bekommt. Wird der Kauf überhaupt ordentlich abgewickelt? Auf Google Seite.

Ich sehe in deinen Code auch nichts wo du google sagst wieviel der kauf kostet. Scheint für mich nur die Hälfte des ganzen Ablaufs zu sein.
 
Zuletzt bearbeitet:

wer112

Top Contributor
Mal eine Frage findet den überhaupt der Verkauf statt? Würdest du auch das, Geld bekommen?
Erstmal egal ob der user seine gekauften coins von dir in der App bekommt. Wird der Kauf überhaupt ordentlich abgewickelt? Auf Google Seite.

Ich sehe in deinen Code auch nichts wo du google sagst wieviel der kauf kostet. Scheint für mich nur die Hälfte des ganzen Ablaufs zu sein.
Der Preis ist ja in der Google Console hinterlegt und mit der Produkt Id holt man alles in die App.

In diesem Video Sieht man wie die App funktioniert. Das Problem ist, wie zu sehen, dass nach meinen Code, das Produkt erst Gutgeschrieben wird und dann der entsprechender Kauf beginnt. Leider findet man garnix mit mehreren festen Buttons...

 

wer112

Top Contributor
Ob es ein oder mehrere Button sind ist doch ersrstmal egal. Wenn der Kauf beendet ist kommst du immer in der gleichen Methode an.
Du scheinst das Prinzip vom callback oder listener nicht verstanden zu haben.
Sehe ich auch daran das du dich schon schwer tust einen Button mit listener in der onCreate zu erstellen.

Wenn du verstanden hast wie es mit einen Button geht ist es doch einfach mehrere anzubieten. In jedem Button bei jedem bp.purchase(this, "button2");
Übergibt du doch einen Strings mit dem du auch in der callback Methode nach dem Kauf prüfen kannst von wo der Aufruf kommt. Um auch estrechend deine Variablen zu setzten also ob 2 5 oder 10 Münzen gekauft wurden.
onProductPurchased(String productId, details) {
Schau dich mal was in dem string ist ob das dein übergebner Strings ist.

Dann schaue in die Doku wie TransactionDetails aufgebaut ist und was in ihr alles gespeichert sein kann.

PS wenn du 10 Button hast dein Ergebnis kommt immer in der gleichen Methode an.
Normaler Weise mache ich ja in der oncreate Methode das mit den Buttons: button1.setOnClickListener(new View.OnClickListener.......). Ich habe das so gemacht, wie im Youtube Video, dass ich verwendet habe. Ich habe es leicht geändert(von Abo zu Käufe)

Das ist das Youtube Video, das ich verwendet habe:
 

mrBrown

Super-Moderator
Mitarbeiter
Dir fehlen einfach Grundlagen, die kann man hier im Forum nicht sinnvoll erklären.

Hast du mal in die Doku geschaut? Was denkst du, wofür die Methode onProductPurchased gut sein könnte?


Leider findet man garnix mit mehreren festen Buttons...
Weil es völlig irrelevant ist, ob es einen Button oder 17 Buttons oder gar keinen Button gibt.
 

Ähnliche Java Themen

Neue Themen


Oben