Sorry, das ich mit diesem Thema anfange. Nach mein letzten Beitrag, wo ich gefragt habe, wie man das mit dem In App Käufe hinbekommt, habe ich jetzt hinbekommen mit der Test App. Ich kann das Kaufen und verbrauchen und anschließend werden die Coins gutgeschrieben. Ich kann somit ein Produkt unendlich hintereinander kaufen.
Ich war stolz darauf, wo ich den Code in einer meine anderen App hinzugefügt hatte. Ich hatte es ganz genau so gemacht, wie mit der Test App. Ich habe meine andere App fertig gestellt mit dem jetzigen Kauf Version. Habe es in der Console im Offenen Test hochgeladen, zum Glück wurde die App abgelehnt, weil die Nutzer hätten ihre gekauften Coins nicht erhalten können. Das wäre Betrug sonst. Ich möchte, dass es richtig funktioniert, ohne das ich Leute abziehe, weil der Code nicht glappt. Darum bin ich froh das die App gelehnt wurden ist, jetzt kann ich das Problem(mit eure Hilfe) lösen.
Problem 1: Ich kann alle Produkte nur einmal kaufen und wenn ich Glück habe, ein zweites mal.
Problem 2: Die Coins werden nicht gutgeschrieben, auch noch nicht mal ein Toast angezeigt werden. (Das Speichern wäre nach dem es gutgeschrieben ist....)
Das ist der Code von der App, die perfekt funktioniert!(Nach letztes Thema)
[CODE lang="java" title="In App Purchase Test"]package ...............;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
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;
private String produktId = "";
@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");
bp.consumePurchase("button1");
produktId = "button1";
}else{
}
});
btn2.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(this, "button2");
bp.consumePurchase("button2");
produktId = "button2";
}else{
}
});
btn3.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(this, "button3");
bp.consumePurchase("button3");
produktId = "button3";
}else{
}
});
}
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
if (produktId == "button1"){
coins += 2;
SharedPreferences prefs = getSharedPreferences("Coins", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("coins" , coins);
editor.apply();
coinText.setText(coins + " Coins");
}
if (produktId == "button2"){
coins += 5;
SharedPreferences prefs = getSharedPreferences("Coins", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("coins" , coins);
editor.apply();
coinText.setText(coins + " Coins");
}
if (produktId == "button3"){
coins += 8;
SharedPreferences prefs = getSharedPreferences("Coins", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("coins" , coins);
editor.apply();
coinText.setText(coins + " Coins");
}
}
@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]
Und das Video, was die App im realen Zeigt!
Video 1: https://drive.google.com/file/d/1jxhUm9UHULJ7YO4GJ0e7cYyKld3A520Z/view?usp=sharing
Und das ist der Code von der App die ich eigentlich online stellen wollte, mit dem Code (siehe Video 1)(Der Ursprungscode!):
[CODE lang="java" title="Der Ursprungscode"]package ..........;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class fragment_shop extends Fragment implements BillingProcessor.IBillingHandler {
TextView coinText;
private Button btn1, btn2, btn3, btn4, btn5, btn6;
private BillingProcessor bp;
FirebaseAuth fAuth;
FirebaseFirestore fStore;
String userID;
private int coins = 0;
private String produktId = "";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/* --------------------------------- Hier kommt alles rein, was normalerweise in die onCreat Methode kommt -------------------------------- */
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View fragmentlayout_shop = inflater.inflate(R.layout.shop_layout, null);
coinText = (TextView)fragmentlayout_shop.findViewById(R.id.textView7);
LadenCoins();
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
btn1 = (Button)fragmentlayout_shop.findViewById(R.id.button2);
btn2 = (Button)fragmentlayout_shop.findViewById(R.id.button3);
btn3 = (Button)fragmentlayout_shop.findViewById(R.id.button4);
btn4 = (Button)fragmentlayout_shop.findViewById(R.id.button6);
btn5 = (Button)fragmentlayout_shop.findViewById(R.id.button7);
btn6 = (Button)fragmentlayout_shop.findViewById(R.id.button8);
bp = new BillingProcessor(getActivity(), getResources().getString(R.string.play_console_license), fragment_shop.this);
bp.initialize();
return fragmentlayout_shop;
}
public void onBackPressed() {
Log.e("######","Du kommst hier net raus");
}
private void LadenCoins() {
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
documentReference.addSnapshotListener(getActivity(), new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
coins = value.getLong("Coins").intValue();
coinText.setText("" + coins);
}
});
}
@Override
public void onBillingInitialized() {
btn1.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_zehn_coins");
bp.consumePurchase("product_zehn_coins");
produktId = "product_zehn_coins";
}else{
}
});
btn2.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenfundzwanzig_coins");
bp.consumePurchase("product_fuenfundzwanzig_coins");
produktId = "product_fuenfundzwanzig_coins";
}else{
}
});
btn3.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenfzig_coins");
bp.consumePurchase("product_fuenfzig_coins");
produktId = "product_fuenfzig_coins";
}else{
}
});
btn4.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_einhundert_coins");
bp.consumePurchase("product_einhundert_coins");
produktId = "product_einhundert_coins";
}else{
}
});
btn5.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_eintausend_coins");
bp.consumePurchase("product_eintausend_coins");
produktId = "product_eintausend_coins";
}else{
}
});
btn6.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenftausend_coins");
bp.consumePurchase("product_fuenftausend_coins");
produktId = "product_fuenftausend_coins";
}else{
}
});
}
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
if (produktId == "product_zehn_coins"){
coins += 10;
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_fuenfundzwanzig_coins"){
coins += 25;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_fuenfzig_coins"){
coins += 50;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_einhundert_coins"){
coins += 100;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_eintausend_coins"){
coins += 1000;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_fuenftausend_coins"){
coins += 5000;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
}
@Override
public void onPurchaseHistoryRestored() {
}
@Override
public void onBillingError(int errorCode, Throwable error) {
}
}
[/CODE]
So funktioniert am Ende Beide Codes(Macht kein Unterschied!):
Das ist der Code als das ursprünglicher Code nicht funktioniert hat:
[CODE lang="java" title="Nach dem ursprünglicher Code nicht funktioniert hat."]package de.klugaug.tiktokfollowerlikes;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class fragment_shop extends Fragment implements BillingProcessor.IBillingHandler {
TextView coinText;
private Button btn1, btn2, btn3, btn4, btn5, btn6;
private BillingProcessor bp;
FirebaseAuth fAuth;
FirebaseFirestore fStore;
String userID;
private int coins = 0;
private String produktID = "";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/* --------------------------------- Hier kommt alles rein, was normalerweise in die onCreat Methode kommt -------------------------------- */
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View fragmentlayout_shop = inflater.inflate(R.layout.shop_layout, null);
coinText = (TextView)fragmentlayout_shop.findViewById(R.id.textView7);
LadenCoins();
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
btn1 = (Button)fragmentlayout_shop.findViewById(R.id.button2);
btn2 = (Button)fragmentlayout_shop.findViewById(R.id.button3);
btn3 = (Button)fragmentlayout_shop.findViewById(R.id.button4);
btn4 = (Button)fragmentlayout_shop.findViewById(R.id.button6);
btn5 = (Button)fragmentlayout_shop.findViewById(R.id.button7);
btn6 = (Button)fragmentlayout_shop.findViewById(R.id.button8);
bp = new BillingProcessor(getActivity(), getResources().getString(R.string.play_console_license), fragment_shop.this);
bp.initialize();
return fragmentlayout_shop;
}
public void onBackPressed() {
Log.e("######","Du kommst hier net raus");
}
private void LadenCoins() {
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
documentReference.addSnapshotListener(getActivity(), new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
coins = value.getLong("Coins").intValue();
coinText.setText("" + coins);
}
});
}
@Override
public void onBillingInitialized() {
btn1.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_zehn_coins");
bp.consumePurchase("product_zehn_coins");
produktID = "product_zehn_coins";
}else{
}
});
btn2.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenfundzwanzig_coins");
bp.consumePurchase("product_fuenfundzwanzig_coins");
produktID = "product_fuenfundzwanzig_coins";
}else{
}
});
btn3.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenfzig_coins");
bp.consumePurchase("product_fuenfzig_coins");
produktID = "product_fuenfzig_coins";
}else{
}
});
btn4.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_einhundert_coins");
bp.consumePurchase("product_einhundert_coins");
produktID = "product_einhundert_coins";
}else{
}
});
btn5.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_eintausend_coins");
bp.consumePurchase("product_eintausend_coins");
produktID = "product_eintausend_coins";
}else{
}
});
btn6.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenftausend_coins");
bp.consumePurchase("product_fuenftausend_coins");
produktID = "product_fuenftausend_coins";
}else{
}
});
}
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
if (productId.equals(produktID)){
coins += 10;
Toast.makeText(getActivity(), "10 Coins" + getString(R.string.erfolgreich_gekauft), Toast.LENGTH_SHORT).show();
coinText.setText(coins + " Coins");
}
if (productId == "product_fuenfundzwanzig_coins"){
coins += 25;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktID == "product_fuenfzig_coins"){
coins += 50;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktID == "product_einhundert_coins"){
coins += 100;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktID == "product_eintausend_coins"){
coins += 1000;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktID == "product_fuenftausend_coins"){
coins += 5000;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
}
@Override
public void onPurchaseHistoryRestored() {
}
@Override
public void onBillingError(int errorCode, Throwable error) {
}
}
[/CODE]
Warum funktioniert der Code in der Demo App perfekt(siehe Video)?
Und warum funktioniert der gleiche Code überhaubt nicht in der anderen App, obwohl alles gleich ist?
Ich will es so machen, wie in meine Demo App, warum läufte er aber nicht in die anderen Apps?
Ich benötige dafür dringend eure Hilfe, bevor diese App wieder veröffentliche.
Ich bin für jede Antwort sehr dankbar.
Ich war stolz darauf, wo ich den Code in einer meine anderen App hinzugefügt hatte. Ich hatte es ganz genau so gemacht, wie mit der Test App. Ich habe meine andere App fertig gestellt mit dem jetzigen Kauf Version. Habe es in der Console im Offenen Test hochgeladen, zum Glück wurde die App abgelehnt, weil die Nutzer hätten ihre gekauften Coins nicht erhalten können. Das wäre Betrug sonst. Ich möchte, dass es richtig funktioniert, ohne das ich Leute abziehe, weil der Code nicht glappt. Darum bin ich froh das die App gelehnt wurden ist, jetzt kann ich das Problem(mit eure Hilfe) lösen.
Problem 1: Ich kann alle Produkte nur einmal kaufen und wenn ich Glück habe, ein zweites mal.
Problem 2: Die Coins werden nicht gutgeschrieben, auch noch nicht mal ein Toast angezeigt werden. (Das Speichern wäre nach dem es gutgeschrieben ist....)
Das ist der Code von der App, die perfekt funktioniert!(Nach letztes Thema)
[CODE lang="java" title="In App Purchase Test"]package ...............;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
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;
private String produktId = "";
@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");
bp.consumePurchase("button1");
produktId = "button1";
}else{
}
});
btn2.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(this, "button2");
bp.consumePurchase("button2");
produktId = "button2";
}else{
}
});
btn3.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(this, "button3");
bp.consumePurchase("button3");
produktId = "button3";
}else{
}
});
}
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
if (produktId == "button1"){
coins += 2;
SharedPreferences prefs = getSharedPreferences("Coins", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("coins" , coins);
editor.apply();
coinText.setText(coins + " Coins");
}
if (produktId == "button2"){
coins += 5;
SharedPreferences prefs = getSharedPreferences("Coins", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("coins" , coins);
editor.apply();
coinText.setText(coins + " Coins");
}
if (produktId == "button3"){
coins += 8;
SharedPreferences prefs = getSharedPreferences("Coins", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("coins" , coins);
editor.apply();
coinText.setText(coins + " Coins");
}
}
@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]
Und das Video, was die App im realen Zeigt!
Video 1: https://drive.google.com/file/d/1jxhUm9UHULJ7YO4GJ0e7cYyKld3A520Z/view?usp=sharing
Und das ist der Code von der App die ich eigentlich online stellen wollte, mit dem Code (siehe Video 1)(Der Ursprungscode!):
[CODE lang="java" title="Der Ursprungscode"]package ..........;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class fragment_shop extends Fragment implements BillingProcessor.IBillingHandler {
TextView coinText;
private Button btn1, btn2, btn3, btn4, btn5, btn6;
private BillingProcessor bp;
FirebaseAuth fAuth;
FirebaseFirestore fStore;
String userID;
private int coins = 0;
private String produktId = "";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/* --------------------------------- Hier kommt alles rein, was normalerweise in die onCreat Methode kommt -------------------------------- */
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View fragmentlayout_shop = inflater.inflate(R.layout.shop_layout, null);
coinText = (TextView)fragmentlayout_shop.findViewById(R.id.textView7);
LadenCoins();
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
btn1 = (Button)fragmentlayout_shop.findViewById(R.id.button2);
btn2 = (Button)fragmentlayout_shop.findViewById(R.id.button3);
btn3 = (Button)fragmentlayout_shop.findViewById(R.id.button4);
btn4 = (Button)fragmentlayout_shop.findViewById(R.id.button6);
btn5 = (Button)fragmentlayout_shop.findViewById(R.id.button7);
btn6 = (Button)fragmentlayout_shop.findViewById(R.id.button8);
bp = new BillingProcessor(getActivity(), getResources().getString(R.string.play_console_license), fragment_shop.this);
bp.initialize();
return fragmentlayout_shop;
}
public void onBackPressed() {
Log.e("######","Du kommst hier net raus");
}
private void LadenCoins() {
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
documentReference.addSnapshotListener(getActivity(), new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
coins = value.getLong("Coins").intValue();
coinText.setText("" + coins);
}
});
}
@Override
public void onBillingInitialized() {
btn1.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_zehn_coins");
bp.consumePurchase("product_zehn_coins");
produktId = "product_zehn_coins";
}else{
}
});
btn2.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenfundzwanzig_coins");
bp.consumePurchase("product_fuenfundzwanzig_coins");
produktId = "product_fuenfundzwanzig_coins";
}else{
}
});
btn3.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenfzig_coins");
bp.consumePurchase("product_fuenfzig_coins");
produktId = "product_fuenfzig_coins";
}else{
}
});
btn4.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_einhundert_coins");
bp.consumePurchase("product_einhundert_coins");
produktId = "product_einhundert_coins";
}else{
}
});
btn5.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_eintausend_coins");
bp.consumePurchase("product_eintausend_coins");
produktId = "product_eintausend_coins";
}else{
}
});
btn6.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenftausend_coins");
bp.consumePurchase("product_fuenftausend_coins");
produktId = "product_fuenftausend_coins";
}else{
}
});
}
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
if (produktId == "product_zehn_coins"){
coins += 10;
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_fuenfundzwanzig_coins"){
coins += 25;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_fuenfzig_coins"){
coins += 50;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_einhundert_coins"){
coins += 100;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_eintausend_coins"){
coins += 1000;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktId == "product_fuenftausend_coins"){
coins += 5000;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
}
@Override
public void onPurchaseHistoryRestored() {
}
@Override
public void onBillingError(int errorCode, Throwable error) {
}
}
[/CODE]
So funktioniert am Ende Beide Codes(Macht kein Unterschied!):
Das ist der Code als das ursprünglicher Code nicht funktioniert hat:
[CODE lang="java" title="Nach dem ursprünglicher Code nicht funktioniert hat."]package de.klugaug.tiktokfollowerlikes;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class fragment_shop extends Fragment implements BillingProcessor.IBillingHandler {
TextView coinText;
private Button btn1, btn2, btn3, btn4, btn5, btn6;
private BillingProcessor bp;
FirebaseAuth fAuth;
FirebaseFirestore fStore;
String userID;
private int coins = 0;
private String produktID = "";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/* --------------------------------- Hier kommt alles rein, was normalerweise in die onCreat Methode kommt -------------------------------- */
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View fragmentlayout_shop = inflater.inflate(R.layout.shop_layout, null);
coinText = (TextView)fragmentlayout_shop.findViewById(R.id.textView7);
LadenCoins();
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
btn1 = (Button)fragmentlayout_shop.findViewById(R.id.button2);
btn2 = (Button)fragmentlayout_shop.findViewById(R.id.button3);
btn3 = (Button)fragmentlayout_shop.findViewById(R.id.button4);
btn4 = (Button)fragmentlayout_shop.findViewById(R.id.button6);
btn5 = (Button)fragmentlayout_shop.findViewById(R.id.button7);
btn6 = (Button)fragmentlayout_shop.findViewById(R.id.button8);
bp = new BillingProcessor(getActivity(), getResources().getString(R.string.play_console_license), fragment_shop.this);
bp.initialize();
return fragmentlayout_shop;
}
public void onBackPressed() {
Log.e("######","Du kommst hier net raus");
}
private void LadenCoins() {
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
documentReference.addSnapshotListener(getActivity(), new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
coins = value.getLong("Coins").intValue();
coinText.setText("" + coins);
}
});
}
@Override
public void onBillingInitialized() {
btn1.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_zehn_coins");
bp.consumePurchase("product_zehn_coins");
produktID = "product_zehn_coins";
}else{
}
});
btn2.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenfundzwanzig_coins");
bp.consumePurchase("product_fuenfundzwanzig_coins");
produktID = "product_fuenfundzwanzig_coins";
}else{
}
});
btn3.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenfzig_coins");
bp.consumePurchase("product_fuenfzig_coins");
produktID = "product_fuenfzig_coins";
}else{
}
});
btn4.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_einhundert_coins");
bp.consumePurchase("product_einhundert_coins");
produktID = "product_einhundert_coins";
}else{
}
});
btn5.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_eintausend_coins");
bp.consumePurchase("product_eintausend_coins");
produktID = "product_eintausend_coins";
}else{
}
});
btn6.setOnClickListener(v ->{
if(bp.isOneTimePurchaseSupported()){
bp.purchase(getActivity(), "product_fuenftausend_coins");
bp.consumePurchase("product_fuenftausend_coins");
produktID = "product_fuenftausend_coins";
}else{
}
});
}
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
if (productId.equals(produktID)){
coins += 10;
Toast.makeText(getActivity(), "10 Coins" + getString(R.string.erfolgreich_gekauft), Toast.LENGTH_SHORT).show();
coinText.setText(coins + " Coins");
}
if (productId == "product_fuenfundzwanzig_coins"){
coins += 25;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktID == "product_fuenfzig_coins"){
coins += 50;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktID == "product_einhundert_coins"){
coins += 100;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktID == "product_eintausend_coins"){
coins += 1000;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
if (produktID == "product_fuenftausend_coins"){
coins += 5000;
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("Guthaben").document(userID);
Map<String, Object> user_guthaben = new HashMap<>();
user_guthaben.put("Coins", coins);
documentReference.set(user_guthaben);
coinText.setText(coins + " Coins");
}
}
@Override
public void onPurchaseHistoryRestored() {
}
@Override
public void onBillingError(int errorCode, Throwable error) {
}
}
[/CODE]
Warum funktioniert der Code in der Demo App perfekt(siehe Video)?
Und warum funktioniert der gleiche Code überhaubt nicht in der anderen App, obwohl alles gleich ist?
Ich will es so machen, wie in meine Demo App, warum läufte er aber nicht in die anderen Apps?
Ich benötige dafür dringend eure Hilfe, bevor diese App wieder veröffentliche.
Ich bin für jede Antwort sehr dankbar.