java.lang.IllegalArgumentException:如果没有verifyProof,sessionInfo或临时证明,则无法创建PhoneAuthCredential

时间:2019-03-13 11:51:52

标签: java android xml

请在我的代码帮助中发生此异常。我的所有代码都张贴在下面。

java.lang.IllegalArgumentException: Cannot create PhoneAuthCredential
without either verificationProof, sessionInfo, ortemprary proof.
        at com.google.android.gms.common.internal.Preconditions.checkArgument(Unknown
Source)
        at com.google.firebase.auth.PhoneAuthCredential.<init>(Unknown Source)
        at com.google.firebase.auth.PhoneAuthProvider.getCredential(Unknown
Source)
        at com.approsoft.momentsapp.providerfrags.EnterPhoneFragment$3.onVerificationCompleted(EnterPhoneFragment.java:177)
        at com.google.firebase.auth.api.internal.zzer.zza(Unknown Source)
        at com.google.firebase.auth.api.internal.zzeu.run(Unknown Source)
        at android.os.Handler.handleCallback(Handler.java:815)
        at android.os.Handler.dispatchMessage(Handler.java:104)
        at android.os.Looper.loop(Looper.java:238)
        at android.app.ActivityThread.main(ActivityThread.java:6006)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:937)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:798)

在将ui版本4.0.1更新为4.2.0并更新4.3.1之前,如何解决此问题,但不能解决此问题

我在此问题上已经过了很多天,但仍无法解决,请帮助。

这是我的代码

public class EnterPhoneFragment extends Fragment {

Button btnSendCode, btnVerify, btnResendCode;
EditText etCode;
IntlPhoneInput etPhoneNumber;
TextView tvTerms;

PhoneAuthProvider.OnVerificationStateChangedCallbacks verificationCallbacks;
PhoneAuthProvider.ForceResendingToken resendingToken;
FirebaseAuth firebaseAuth;

String phoneVerificationID;
HashMap<String, String> userDetails;
String userID;

private static final long TIMEOUT_DURATION = 60;

SessionManager sessionManager;
FragmentManager fragmentManager;
private MaterialDialog dialogSave;
private String smsCode;
private PhoneAuthCredential credential;

public EnterPhoneFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_enter_phone, container, false);
    sessionManager = new SessionManager(getActivity());
    userDetails = sessionManager.getUserDetails();
    userID = userDetails.get(SessionManager.KEY_USER_ID);
    fragmentManager = getFragmentManager();

    firebaseAuth = FirebaseAuth.getInstance();
    setUpVerificationCallbacks();
    tvTerms = view.findViewById(R.id.tvTerms);
    String termsString = "<u><b>Terms of Service</b></u>";
    tvTerms.setText(Html.fromHtml(termsString));
    etPhoneNumber = view.findViewById(R.id.etPhoneNumber);

    etCode = view.findViewById(R.id.etCode);
    etCode.setEnabled(false);

    btnResendCode = view.findViewById(R.id.btnResendCode);
    btnResendCode.setEnabled(false);

    dialogSave = new MaterialDialog.Builder(getActivity())
            .title("Sending")
            .content("Please wait")
            .cancelable(false)
            .progress(true, 0).build();

    btnVerify = view.findViewById(R.id.btnVerify);
    btnVerify.setEnabled(false);
    btnVerify.setBackgroundColor(getResources().getColor(R.color.colorGrey));
    btnVerify.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String code = etCode.getText().toString();
            if (TextUtils.isEmpty(code)) {
                etCode.setError("Enter smsCode first");
                etCode.requestFocus();
            } else {
                if (smsCode.equals(code)) {
                    signInWithPhoneCredential(credential);
                } else {
                    Toast.makeText(getActivity(), "Enter a valid code!", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });

    btnSendCode = view.findViewById(R.id.btnSendCode);
    btnSendCode.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String phoneNumber;
            if (etPhoneNumber.isValid()) {
                phoneNumber = etPhoneNumber.getNumber();
                verifyPhoneNumber(phoneNumber);

            } else {
                Toast.makeText(getActivity().getApplicationContext(), "Enter a valid phone number!", Toast.LENGTH_SHORT).show();
            }
        }
    });
    saveSetting();
    return view;
}

@Override
public void onResume() {
    super.onResume();
}

@Override
public void onPause() {
    super.onPause();
}
public void verifyPhoneNumber(String phoneNumber){
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phoneNumber,
            60,
            TimeUnit.SECONDS,
            getActivity(),
            verificationCallbacks);
}

private void setUpVerificationCallbacks() {
    try {
        verificationCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                //signInWithPhoneCredential(phoneAuthCredential);
                smsCode = phoneAuthCredential.getSmsCode();
                credential = PhoneAuthProvider.getCredential(phoneVerificationID, smsCode);
            }

            @Override
            public void onVerificationFailed(FirebaseException e) {
                if (e instanceof FirebaseAuthInvalidCredentialsException) {
                    Toast.makeText(getActivity().getApplicationContext(), "Invalid credentials used. Try again!", Toast.LENGTH_SHORT).show();
                } else if (e instanceof FirebaseTooManyRequestsException) {
                    Toast.makeText(getActivity().getApplicationContext(), "SMS Quota expired. Come back later.", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                phoneVerificationID = s;
                resendingToken = forceResendingToken;
                etPhoneNumber.setEnabled(false);
                btnSendCode.setEnabled(false);
                etCode.setEnabled(true);
                btnVerify.setEnabled(true);
                btnVerify.setBackgroundColor(getResources().getColor(R.color.colorIndigoBlue));
                btnResendCode.setEnabled(true);
            }
        };
    } catch (Exception ex) {
        Log.i("IllegalState", "Exception is Illegal state exception");
    }
}

private void signInWithPhoneCredential(PhoneAuthCredential credential) {
    firebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        FirebaseUser user = task.getResult().getUser();
                        final String userPhone = user.getPhoneNumber();
                        RequestQueue queue = Volley.newRequestQueue(getActivity());
                        try {
                            dialogSave.show();

                            // Request a string response from the provided URL.
                            StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.url + "save_phone.php",
                                    new Response.Listener<String>() {
                                        @Override
                                        public void onResponse(String result) {
                                            if (!dialogSave.isCancelled()) {
                                                dialogSave.dismiss();
                                            }
                                            if (result.equals("Error")) {
                                                Toast.makeText(getActivity(), "userId and mobile are not empty!", Toast.LENGTH_SHORT).show();
                                            }
                                            if (result.equals("this mobile number already exist!")) {
                                                Toast.makeText(getActivity(), "this mobile number already exist!", Toast.LENGTH_SHORT).show();
                                            } else {
                                                try {
                                                    JSONObject response = new JSONObject(result);
                                                    String userEmail = response.getString("email");
                                                    if (userEmail != null && !userEmail.isEmpty()) {
                                                        String userID = response.getString("id");
                                                        String fbID = response.getString("fb_id");
                                                        String googleID = response.getString("google_id");
                                                        String firstName = response.getString("first_name");
                                                        String lastName = response.getString("last_name");
                                                        String userPass = response.getString("password");
                                                        String userMobile = response.getString("mobile");
                                                        String userLocation = response.getString("location");
                                                        String userDOB = response.getString("dob");
                                                        String userGender = response.getString("gender");
                                                        String posts = response.getString("posts");
                                                        String following = response.getString("following");
                                                        String followers = response.getString("followers");
                                                        String userImagePath = "http://fotogher.com/app/Moments/provider/" + response.getString("image_path");
                                                        sessionManager.createLoginSession(userID, userEmail, fbID, googleID,
                                                                firstName, lastName, userPass, userMobile, userLocation,
                                                                userDOB, userGender, userImagePath, posts, following, followers);
                                                        for (int i = 0; i < fragmentManager.getBackStackEntryCount(); i++) {
                                                            fragmentManager.popBackStack();
                                                        }
                                                        startActivity(new Intent(getActivity(), MainActivity.class));
                                                        getActivity().finish();
                                                    } else {
                                                        Toast.makeText(getActivity().getApplicationContext(),
                                                                "Profile creation failed. Try again!",
                                                                Toast.LENGTH_SHORT).show();
                                                    }
                                                } catch (JSONException e) {
                                                    e.printStackTrace();
                                                }
                                            }
                                        }
                                    }, new Response.ErrorListener() {
                                @Override
                                public void onErrorResponse(VolleyError error) {
                                    if (!dialogSave.isCancelled()) {
                                        dialogSave.dismiss();
                                    }
                                    Toast.makeText(getActivity(), "Error!", Toast.LENGTH_SHORT).show();
                                }

                            }) {
                                @Override
                                protected Map<String, String> getParams() {
                                    Map<String, String> params = new HashMap<String, String>();
                                    params.put("mobile", userPhone);
                                    params.put("user_id", userID);
                                    return params;
                                }

                                @Override
                                public Map<String, String> getHeaders() throws AuthFailureError {
                                    Map<String, String> params = new HashMap<String, String>();
                                    params.put("Content-Type", "application/x-www-form-urlencoded");
                                    return params;
                                }
                            };
                            // Add the request to the RequestQueue.
                            queue.add(stringRequest);
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }

                    } else {
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification smsCode entered was invalid
                            Log.i("Exception","Invalid smsCode entered. Try again!");
                        }
                    }
                }
            });
}
  

我的gradle文件是这个

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.approsoft.momentsapp"
        minSdkVersion 17
        targetSdkVersion 27
        versionCode 2
        versionName "0.1"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
repositories {
    mavenCentral()
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    /*implementation 'com.android.support:appcompat-v7:26.1.0'*/
    implementation 'com.android.support:design:27.1.1'
    /*implementation 'com.android.support.constraint:constraint-layout:1.0.2'*/
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.google.firebase:firebase-core:16.0.7'
    implementation 'com.google.android.gms:play-services-auth:16.0.1'
    implementation 'com.google.firebase:firebase-database:16.1.0'
    implementation 'com.google.firebase:firebase-analytics:16.3.0'
    implementation 'com.google.firebase:firebase-auth:16.1.0'
    implementation 'com.google.firebase:firebase-messaging:17.4.0'
    implementation 'com.google.android.gms:play-services-places:16.0.0'
    implementation 'com.google.android.gms:play-services-location:16.0.0'
    implementation 'com.firebaseui:firebase-ui-auth:4.2.0'
    implementation 'com.facebook.android:facebook-android-sdk:4.29.0'
    implementation 'com.github.ittianyu:BottomNavigationViewEx:1.2.4'
    implementation 'de.hdodenhof:circleimageview:2.2.0'
    implementation 'com.loopj.android:android-async-http:1.4.9'
    implementation 'com.wonderkiln:camerakit:0.13.2'
    implementation 'com.camerakit:jpegkit:0.1.0'
    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.0'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0'
//    compile 'com.github.yalantis:ucrop:2.2.1'
    implementation 'com.github.bumptech.glide:glide:4.6.1'
    implementation 'com.afollestad.material-dialogs:core:0.9.6.0'
/*    implementation 'com.hbb20:ccp:2.2.3'*/
    implementation 'com.github.mukeshsolanki:country-picker-android:2.0.1'
    implementation 'hani.momanii.supernova_emoji_library:supernova-emoji-library:0.0.2'
    //for video view
    //implementation 'com.github.halilozercan:BetterVideoPlayer:kotlin-SNAPSHOT'
    implementation 'com.android.volley:volley:1.1.1'
    //implementation 'com.github.hani-momanii:SuperNova-Emoji:1.1'
    //implementation project(':supernova-emoji-library')
//    compile 'id.zelory:compressor:2.1.0'
    implementation 'net.rimoto:intlphoneinput:1.0.1'
    implementation 'com.github.zcweng:switch-button:0.0.3@aar'
    implementation 'com.bikomobile:multipart:1.3.4'
    implementation 'com.github.shts:StoriesProgressView:3.0.0'
    implementation('com.mapbox.mapboxsdk:mapbox-android-sdk:6.5.0@aar') {
        transitive = true
    }
    implementation 'com.mapbox.mapboxsdk:mapbox-android-navigation:0.19.0'
    implementation('com.mapbox.mapboxsdk:mapbox-android-navigation-ui:0.19.0') {
        transitive = true
    }
    implementation 'com.android.support:multidex:1.0.3'
//    testImplementation 'junit:junit:4.12'
//    androidTestImplementation 'com.android.support.test:runner:1.0.1'
//    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

apply plugin: 'com.google.gms.google-services'

2 个答案:

答案 0 :(得分:1)

Alex Saveau 所说(Firebase UI开发人员之一):

  

用户将切换到其消息传递应用程序,并且没有太多的可用RAM,因此它会杀死您的应用程序。由于我们仅将验证ID存储在内存中,因此它会丢失。旁注:我们添加这样的错误的次数,您认为我们会学习的。不。

因此,请检查您的代码和内存并追踪mabye,您可以找到一些摆脱它的方法,但目前此问题仍未解决

来源:github.com

答案 1 :(得分:0)

将基于Firebase设置的SHA代码添加到项目中。如果已经完成,请对最近的一次重新执行。它为我工作。