Code Verifizierung und oder Weiterleitung funktioniert einfach nicht

  • Antworten:13
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 8

29.03.2021, 04:06:16 via Website

Kann mir hier bitte jemand helfen? Warum werde ich nicht weitergeleitet?

import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseException;
import com.google.firebase.FirebaseTooManyRequestsException;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthProvider;
import com.ybs.countrypicker.CountryPicker;
import com.ybs.countrypicker.CountryPickerListener;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.concurrent.TimeUnit;

public class Login_Phone extends AppCompatActivity {

private String phoneVerificationId;
private PhoneAuthProvider.OnVerificationStateChangedCallbacks verificationCallbacks;
private PhoneAuthProvider.ForceResendingToken resendToken;
private FirebaseAuth fbAuth;
EditText phoneText,digit1,digit2,digit3,digit4,digit5,digit6;
TextView countrytxt,countrycodetxt,sendtotxt;
RelativeLayout select_country;
ViewFlipper viewFlipper;
String phoneNumber;

SharedPreferences sharedPreferences;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login_phone);
    fbAuth = FirebaseAuth.getInstance();

    fbAuth.setLanguageCode("en");

    sharedPreferences=getSharedPreferences(Variables.pref_name,MODE_PRIVATE);

    phoneText=findViewById(R.id.phonetxt);

    select_country=findViewById(R.id.select_country);
    select_country.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Opencountry();
        }
    });

    countrytxt    =findViewById(R.id.countrytxt);
    countrycodetxt=findViewById(R.id.countrycodetxt);

    sendtotxt=findViewById(R.id.sendtotxt);

    viewFlipper=findViewById(R.id.viewfillper);

    codefill();

}

//message code fill in edittext and change focus in android
public void codefill(){

    digit1=findViewById(R.id.digitone);
    digit2=findViewById(R.id.digittwo);
    digit3=findViewById(R.id.digitthree);
    digit4=findViewById(R.id.digitfour);
    digit5=findViewById(R.id.digitfive);
    digit6=findViewById(R.id.digitsix);

    digit1.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if(digit1.getText().toString().length()==0){
                digit2.requestFocus();
            }
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    digit2.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if(digit2.getText().toString().length()==0){
                digit3.requestFocus();
            }
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    digit3.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if(digit3.getText().toString().length()==0){
                digit4.requestFocus();
            }
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    digit4.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if(digit4.getText().toString().length()==0){
                digit5.requestFocus();
            }

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    digit5.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if(digit5.getText().toString().length()==0){
                digit6.requestFocus();
            }

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

}

String country_iso_code="US";
@SuppressLint("WrongConstant")
public void Opencountry(){

    final CountryPicker picker = CountryPicker.newInstance("Select Country");
    picker.setListener(new CountryPickerListener() {
        @Override
        public void onSelectCountry(String name, String code, String dialCode, int flagDrawableResID) {
            // Implement your code here
            countrytxt.setText(name);
            countrycodetxt.setText(dialCode);
            picker.dismiss();
            country_iso_code=code;
        }
    });
    picker.setStyle(R.style.countrypicker_style,R.style.countrypicker_style);
    picker.show(getSupportFragmentManager(), "Select Country");

}

public void Nextbtn(View view) {

    phoneNumber=countrycodetxt.getText().toString()+phoneText.getText().toString();
    Send_Number_tofirebase(phoneNumber);

}


public void Send_Number_tofirebase(String phoneNumber){
    setUpVerificatonCallbacks();
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phoneNumber,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            this,               // Activity (for callback binding)
            verificationCallbacks);
}

private void setUpVerificatonCallbacks() {
    Functions.Show_loader(this,false,true);
    verificationCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        @Override
        public void onVerificationCompleted(PhoneAuthCredential credential) {

            Functions.cancel_loader();
            signInWithPhoneAuthCredential(credential);


        }

        @Override
        public void onVerificationFailed(FirebaseException e) {
            Functions.cancel_loader();

            Log.d("responce",e.toString());
            Toast.makeText(Login_Phone_A.this, "Enter Correct Number.", Toast.LENGTH_SHORT).show();
            if (e instanceof FirebaseAuthInvalidCredentialsException) {
                // Invalid request
            } else if (e instanceof FirebaseTooManyRequestsException) {
                // SMS quota exceeded
            }
        }

        @Override
        public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken token) {

            Functions.cancel_loader();

            phoneVerificationId = verificationId;
            resendToken = token;
            sendtotxt.setText("Send to ( "+phoneNumber+" )");
            viewFlipper.setInAnimation(Login_Phone_A.this, R.anim.in_from_right);
            viewFlipper.setOutAnimation(Login_Phone_A.this, R.anim.out_to_left);
            viewFlipper.setDisplayedChild(1);

        }
    };
}


public void verifyCode(View view) {
    String code=""+digit1.getText().toString()+digit2.getText().toString()+digit3.getText().toString()+digit4.getText().toString()+digit5.getText().toString()+digit6.getText().toString();
    if(!code.equals("")){
        Functions.Show_loader(this,false,true);
        PhoneAuthCredential credential = PhoneAuthProvider.getCredential(phoneVerificationId, code);
        signInWithPhoneAuthCredential(credential);
    }else {
        Toast.makeText(this, "Enter the Correct varification Code", Toast.LENGTH_SHORT).show();
    }


}


private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    fbAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {

                        // get the user info to know that user is already login or not
                        Get_User_info();

                    } else {
                        if (task.getException() instanceof
                                FirebaseAuthInvalidCredentialsException) {
                            Functions.cancel_loader();
                        }
                    }
                }
            });
}


public void resendCode(View view) {

    String phoneNumber = phoneText.getText().toString();

    setUpVerificatonCallbacks();

    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phoneNumber,
            60,
            TimeUnit.SECONDS,
            this,
            verificationCallbacks,
            resendToken);
}


public void Goback_1(View view) {
    finish();
}

public void Goback(View view) {
    viewFlipper.setInAnimation(Login_Phone_A.this, R.anim.in_from_left);
    viewFlipper.setOutAnimation(Login_Phone_A.this, R.anim.out_to_right);
    viewFlipper.setDisplayedChild(0);
}


private void Get_User_info() {

    final String phone_no=phoneNumber.replace("+","");
    JSONObject parameters = new JSONObject();
    try {
        parameters.put("fb_id", phone_no);

    } catch (JSONException e) {
        e.printStackTrace();
    }

    Functions.Show_loader(this,false,true);
    ApiRequest.Call_Api(this, Variables.getUserInfo, parameters, new Callback() {
        @Override
        public void Responce(String resp) {
            Functions.cancel_loader();
            try {
                JSONObject jsonObject=new JSONObject(resp);
                String code=jsonObject.optString("code");
                if(code.equals("200")){

                    // if user is already logedin then we will save the user data and go to the enable location screen
                    JSONArray msg=jsonObject.getJSONArray("msg");
                    JSONObject userdata=msg.getJSONObject(0);

                    SharedPreferences.Editor editor=sharedPreferences.edit();
                    editor.putString(Variables.uid,phone_no);
                    editor.putString(Variables.f_name,userdata.optString("first_name"));
                    editor.putString(Variables.l_name,userdata.optString("last_name"));
                    editor.putString(Variables.birth_day,userdata.optString("age"));
                    editor.putString(Variables.gender,userdata.optString("gender"));
                    editor.putString(Variables.u_pic,userdata.optString("image1"));
                    editor.putBoolean(Variables.islogin,true);
                    editor.commit();

                    // after all things done we will move the user to enable location screen
                    enable_location();


                }else {
                    // if user is first time login then we will get the usser picture and name
                    Intent intent=new Intent(Login_Phone_A.this, Get_User_Info_A.class);
                    intent.putExtra("id",phone_no);
                    startActivity(intent);
                    overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
                    finish();

                }

            }catch (JSONException e) {

                e.printStackTrace();
            }

        }
    });

}


private void enable_location() {
    // will move the user for enable location screen
    startActivity(new Intent(this, Enable_location_A.class));
    overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
    finishAffinity();

}

}

Diskutiere mit!
  • Forum-Beiträge: 2.330

29.03.2021, 14:16:06 via Website

Ein bisschen mehr Info wäre schon gut.

Was passiert?
Nichts/Crash/Nicht-das-was-sollte?

Wenn Crash, dann Auszug aus dem Logcat.
Ansonsten kurze Beschreibung welche Aktionen du ausführst, was passiert und was passieren sollte.

Hilfreich?
swa00, Jokel und 1 mehr swa00JokelPascal P.
Diskutiere mit!
  • Forum-Beiträge: 8

30.03.2021, 08:46:08 via Website

Ich komme nicht in die App rein. also es passiert Garnichts wenn ich den Verifizierungscode eingegeben habe.
Die Methode enable_location() sollte dann ausgeführt werden normalerweise. Der sms code wird auch nicht automatisch erkannt wie es sein sollte.

— geändert am 30.03.2021, 08:49:46

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 8

30.03.2021, 10:39:47 via Website

2021-03-30 10:37:21.099 8190-13547/com.brains.dating V/FA: Recording user engagement, ms: 336141

2021-03-30 10:37:21.101 8190-13547/com.brains.dating V/FA: Connecting to remote service
2021-03-30 10:37:21.116 8190-13547/com.brains.dating V/FA: Activity paused, time: 378765456
2021-03-30 10:37:21.185 8190-13547/com.brains.dating V/FA: Connection attempt already in progress
2021-03-30 10:37:21.186 8190-13547/com.brains.dating D/FA: Connected to remote service
2021-03-30 10:37:21.186 8190-13547/com.brains.dating V/FA: Processing queued up service tasks: 2
2021-03-30 10:37:21.238 2503-13552/? V/FA-SVC: Logging event: origin=auto,name=user_engagement(_e),params=Bundle[{ga_event_origin(_o)=auto, engagement_time_msec(_et)=336141, ga_screen_class(_sc)=Login_Phone_A, ga_screen_id(_si)=-8932340500385940295}]
2021-03-30 10:37:21.299 2503-13552/? V/FA-SVC: Upload scheduled in approximately ms: 2334605
2021-03-30 10:37:21.301 2503-13552/? V/FA-SVC: Unscheduling upload
2021-03-30 10:37:21.318 2503-13552/? V/FA-SVC: Scheduling upload, millis: 2334605
2021-03-30 10:37:21.330 2503-13552/? V/FA-SVC: Background event processing time, ms: 93
2021-03-30 10:37:24.857 11645-13619/com.brains.dating V/FA: App measurement collection enabled
2021-03-30 10:37:24.862 11645-13619/com.brains.dating V/FA: App measurement enabled for app package, google app id: com.brains.dating, 1:751708500141:android:027bfee64b924e28e71624
2021-03-30 10:37:24.862 11645-13619/com.brains.dating I/FA: App measurement initialized, version: 39015
2021-03-30 10:37:24.862 11645-13619/com.brains.dating I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
2021-03-30 10:37:24.863 11645-13619/com.brains.dating I/FA: To enable faster debug mode event logging run:
adb shell setprop debug.firebase.analytics.app com.brains.dating
2021-03-30 10:37:24.863 11645-13619/com.brains.dating D/FA: Debug-level message logging enabled
2021-03-30 10:37:24.902 11645-13619/com.brains.dating V/FA: Connecting to remote service
2021-03-30 10:37:24.913 11645-13619/com.brains.dating V/FA: Connection attempt already in progress
2021-03-30 10:37:24.918 11645-13619/com.brains.dating V/FA: Connection attempt already in progress
2021-03-30 10:37:24.967 11645-13607/com.brains.dating V/FA: onActivityCreated
2021-03-30 10:37:25.030 11645-13619/com.brains.dating V/FA: Activity resumed, time: 378769391
2021-03-30 10:37:25.038 11645-13619/com.brains.dating I/FA: Tag Manager is not found and thus will not be used
2021-03-30 10:37:25.053 11645-13619/com.brains.dating V/FA: Connection attempt already in progress
2021-03-30 10:37:25.055 11645-13619/com.brains.dating V/FA: Connection attempt already in progress
2021-03-30 10:37:25.129 11645-13619/com.brains.dating D/FA: Connected to remote service
2021-03-30 10:37:25.129 11645-13619/com.brains.dating V/FA: Processing queued up service tasks: 5
2021-03-30 10:37:25.161 2503-13552/? V/FA-SVC: Logging event: origin=auto,name=screen_view(_vs),params=Bundle[{ga_event_origin(_o)=auto, ga_screen_class(_sc)=Splash_A, ga_screen_id(_si)=-1841158580533375142}]
2021-03-30 10:37:25.163 2503-13552/? V/FA-SVC: Upload scheduled in approximately ms: 2330741
2021-03-30 10:37:25.163 2503-13552/? V/FA-SVC: Unscheduling upload
2021-03-30 10:37:25.165 2503-13552/? V/FA-SVC: Scheduling upload, millis: 2330741
2021-03-30 10:37:25.167 2503-13552/? V/FA-SVC: Background event processing time, ms: 6
2021-03-30 10:37:25.172 2503-13552/? V/FA-SVC: Saving default event parameters, appId, data size: com.brains.dating, 2
2021-03-30 10:37:27.052 11645-13619/com.brains.dating V/FA: Recording user engagement, ms: 2020
2021-03-30 10:37:27.056 11645-13619/com.brains.dating V/FA: Activity paused, time: 378771412
2021-03-30 10:37:27.068 11645-13607/com.brains.dating V/FA: onActivityCreated
2021-03-30 10:37:27.082 2503-13552/? V/FA-SVC: Logging event: origin=auto,name=user_engagement(_e),params=Bundle[{ga_event_origin(_o)=auto, engagement_time_msec(_et)=2020, ga_screen_class(_sc)=Splash_A, ga_screen_id(_si)=-1841158580533375142}]
2021-03-30 10:37:27.085 2503-13552/? V/FA-SVC: Upload scheduled in approximately ms: 2328819
2021-03-30 10:37:27.085 2503-13552/? V/FA-SVC: Unscheduling upload
2021-03-30 10:37:27.088 2503-13552/? V/FA-SVC: Scheduling upload, millis: 2328819
2021-03-30 10:37:27.089 2503-13552/? V/FA-SVC: Background event processing time, ms: 6
2021-03-30 10:37:27.296 11645-13619/com.brains.dating V/FA: Activity resumed, time: 378771657
2021-03-30 10:37:27.337 2503-13552/? V/FA-SVC: Logging event: origin=auto,name=screen_view(_vs),params=Bundle[{ga_event_origin(_o)=auto, ga_previous_class(_pc)=Splash_A, ga_previous_id(_pi)=-1841158580533375142, ga_screen_class(_sc)=Login_A, ga_screen_id(_si)=-1841158580533375141}]
2021-03-30 10:37:27.339 2503-13552/? V/FA-SVC: Upload scheduled in approximately ms: 2328565
2021-03-30 10:37:27.339 2503-13552/? V/FA-SVC: Unscheduling upload
2021-03-30 10:37:27.341 2503-13552/? V/FA-SVC: Scheduling upload, millis: 2328565
2021-03-30 10:37:27.343 2503-13552/? V/FA-SVC: Background event processing time, ms: 6
2021-03-30 10:37:28.815 11645-13619/com.brains.dating V/FA: Recording user engagement, ms: 1519
2021-03-30 10:37:28.819 11645-13619/com.brains.dating V/FA: Activity paused, time: 378773177
2021-03-30 10:37:28.833 11645-13607/com.brains.dating V/FA: onActivityCreated
2021-03-30 10:37:28.843 2503-13552/? V/FA-SVC: Logging event: origin=auto,name=user_engagement(_e),params=Bundle[{ga_event_origin(_o)=auto, engagement_time_msec(_et)=1519, ga_screen_class(_sc)=Login_A, ga_screen_id(_si)=-1841158580533375141}]
2021-03-30 10:37:28.846 2503-13552/? V/FA-SVC: Upload scheduled in approximately ms: 2327058
2021-03-30 10:37:28.846 2503-13552/? V/FA-SVC: Unscheduling upload
2021-03-30 10:37:28.848 2503-13552/? V/FA-SVC: Scheduling upload, millis: 2327058
2021-03-30 10:37:28.849 2503-13552/? V/FA-SVC: Background event processing time, ms: 6
2021-03-30 10:37:28.922 11645-13619/com.brains.dating V/FA: Activity resumed, time: 378773283
2021-03-30 10:37:28.985 2503-13552/? V/FA-SVC: Logging event: origin=auto,name=screen_view(_vs),params=Bundle[{ga_event_origin(_o)=auto, ga_previous_class(_pc)=Login_A, ga_previous_id(_pi)=-1841158580533375141, ga_screen_class(_sc)=Login_Phone_A, ga_screen_id(_si)=-1841158580533375140}]
2021-03-30 10:37:28.987 2503-13552/? V/FA-SVC: Upload scheduled in approximately ms: 2326917
2021-03-30 10:37:28.987 2503-13552/? V/FA-SVC: Unscheduling upload
2021-03-30 10:37:28.991 2503-13552/? V/FA-SVC: Scheduling upload, millis: 2326917
2021-03-30 10:37:28.996 2503-13552/? V/FA-SVC: Background event processing time, ms: 11
2021-03-30 10:37:33.991 11645-13619/com.brains.dating V/FA: Inactivity, disconnecting from the service
2021-03-30 10:37:34.508 11645-11645/com.brains.dating W/IInputConnectionWrapper: requestCursorAnchorInfo on inactive InputConnection
2021-03-30 10:37:47.624 11645-11645/com.brains.dating W/IInputConnectionWrapper: requestCursorAnchorInfo on inactive InputConnection
2021-03-30 10:37:59.777 11645-11645/com.brains.dating W/IInputConnectionWrapper: requestCursorAnchorInfo on inactive InputConnection
2021-03-30 10:38:00.075 11645-11645/com.brains.dating W/IInputConnectionWrapper: requestCursorAnchorInfo on inactive InputConnection
2021-03-30 10:38:00.434 11645-11645/com.brains.dating W/IInputConnectionWrapper: requestCursorAnchorInfo on inactive InputConnection
2021-03-30 10:38:06.134 11645-11645/com.brains.dating W/IInputConnectionWrapper: requestCursorAnchorInfo on inactive InputConnection
2021-03-30 10:38:09.857 11645-11645/com.brains.dating W/IInputConnectionWrapper: requestCursorAnchorInfo on inactive InputConnection

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.433

30.03.2021, 11:38:39 via Website

Hallo erste Frage hast du überhaupt das Authentication über Tel. bei Firebase eingeschaltet?

Kommst du in die Respons Methode von ApiRequest.Call_Api?

Wird die Methode signInWithPhoneAuthCredential auf gerufen?
Erhältst du da auch ein „isSuccessful“ ?

Hast du auch ein fbAuth, ist die App mit Firebase verbunden?

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 8

30.03.2021, 18:34:36 via Website

Ich kann auch nicht viel sagen weil kein fehler gemeldet wird. Jedenfalls kann ich ihn nicht finden.

— geändert am 30.03.2021, 18:35:07

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.433

30.03.2021, 20:15:51 via Website

Hallo wenn ich mir dein Logcat ansehe schaut es für so aus als ob du doch keine richtige Verbindung zu Firebase hast.

Mein Logcat
D/FA: Logging event (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=1183749082539881658}]
V/FA: Connection attempt already in progress
V/FA: Connection attempt already in progress
V/FA: Activity resumed, time: 7404851
Connected to remote service
Processing queued up service tasks: 4
Inactivity, disconnecting from the service
Session started, time: 7415529
Setting user property (FE): _sid
Connecting to remote service

das ist ohne das ich eine Verifizierung Starte

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 8

30.03.2021, 20:38:22 via Website

und was genau muss ich jetzt prüfen?? Denn die nummer steht dann ja bei firebase Authentication

— geändert am 30.03.2021, 20:41:30

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.433

30.03.2021, 22:03:07 via Website

Wenn du bei der Firebase Authentication die Tel. hast sollte es ja geklappt haben.

So nun nochmal die Frage kommst du in deine Get_User_info()?

Denn wenn die Nummer da ist also ein User eingelogt ist, müsstest du in die signInWithPhoneAuthCredential gekommen sein, und auch dein if (task.isSuccessful()) müsste true sein.

Setze ein Log in die Get_User_info um zu prüfen ob du dort hinkommst.
Wenn ja ist dort dein Fehler.

Was ist "ApiRequest.Call_Api" ?

Bitte lasse es auf Fragen nur mit ja oder nein zu Antworden. Ich werde dann mit nein Antworten.
Du willst Hilfe kannst dir dann auch etwas Zeit nehmen wenn wir uns schon freiwillig für dich Zeit nehmen.

— geändert am 30.03.2021, 22:20:44

Hilfreich?
Diskutiere mit!