【问题标题】:Firebase phone authentication is working fine in debug mode but the app is crashing in releaseFirebase 电话身份验证在调试模式下工作正常,但应用程序在发布时崩溃
【发布时间】:2018-06-07 00:57:37
【问题描述】:

是因为权限吗?

我在运行时授予了READ_SMS , RECEIVE_SMS, READ_PHONE_STATE 权限,但它仍然崩溃。

12-26 10:56:02.409 30698-30698/? E/UncaughtException: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=55, result=0, data=null} to activity {com.app.eco4ndly.pathshala/com.app.eco4ndly.pathshala.Opening_Screen}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
                                                      at android.app.ActivityThread.deliverResults(ActivityThread.java:4255)
                                                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:4298)
                                                      at android.app.ActivityThread.-wrap20(ActivityThread.java)
                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1613)
                                                      at android.os.Handler.dispatchMessage(Handler.java:110)
                                                      at android.os.Looper.loop(Looper.java:203)
                                                      at android.app.ActivityThread.main(ActivityThread.java:6339)
                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
                                                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
                                                      at com.app.eco4ndly.pathshala.Opening_Screen.onActivityResult(Opening_Screen.java:108)
                                                      at android.app.Activity.dispatchActivityResult(Activity.java:6948)
                                                      at android.app.ActivityThread.deliverResults(ActivityThread.java:4251)
                                                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:4298) 
                                                      at android.app.ActivityThread.-wrap20(ActivityThread.java) 
                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1613) 
                                                      at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                      at android.os.Looper.loop(Looper.java:203) 
                                                      at android.app.ActivityThread.main(ActivityThread.java:6339) 
                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084) 
                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945) 

还需要做什么?

更新

Openning_Screen.java

private void attemptsRegistration() {

    Intent intent = new Intent(Opening_Screen.this,PhoneVerification.class);
    intent.putExtra(Constant.REQUEST_CODE,55);
    startActivityForResult(intent,55);
}

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        final View view = findViewById(android.R.id.content);
        if (requestCode == 55){
            String result = data.getStringExtra("result");
            if (result.equals("PhoneVerifiedSuccessfully")){
                RegistrationDataPass.setPhone(data.getStringExtra("phone"));
                Intent i = new Intent(Opening_Screen.this,RegPage1.class);
                i.putExtra("PhoneNumber",data.getStringExtra("phone"));
                startActivity(i);
            }else if (result.equals("InvalidCode")){
                Constant.showSnak(view,"Registration Failed\nInvalid Code");
            }else if (result.equals("INVALID REQUEST")){
                Constant.showSnak(view,"Registration Failed\nINVALID REQUEST");
            }else if (result.equals("Too many Request")){
                Constant.showSnak(view,"Registration Failed\nToo many Requests");
            }
        }
}

Phone_Verification.java 代码很大,我正在解释它是如何工作的。 当它开始时,我正在检查 ma​​rshmallow 的权限,然后在授予所有权限后,电话号码将作为用户的输入,然后转到 verifyPhone()

public void verifyPhone(String phn, PhoneAuthProvider.OnVerificationStateChangedCallbacks _mCallbacks){
    mCallbacksResend = _mCallbacks;
    Constant.showProgressBar(this,"You will receive an OTP in "+phn);
    Log.e("STEP Inside ver pn",phn);
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phn,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            this,               // Activity (for callback binding)
            _mCallbacks);        // OnVerificationStateChangedCallback
}

而验证回调是这样的

final PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallBacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        @Override
        public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
            //progressDialog.dismiss();
            Log.d("JEJE", "onVerificationCompleted:" + phoneAuthCredential);
            Log.e("STEP in signin","InsideVerification");
            signInWithPhoneAuthCredential(phoneAuthCredential);
        }

        @Override
        public void onVerificationFailed(FirebaseException e) {
            Constant.hideProgressBar();
            Log.w("JEJE", "onVerificationFailed", e);
            if (e instanceof FirebaseAuthInvalidCredentialsException) {
                Log.d("JEJE", "INVALID REQUEST");
                Intent intent = new Intent();
                intent.putExtra("result","INVALID REQUEST");
                intent.putExtra("phone",phoneNumber);
                setResult(REQ_CODE,intent);
            } else if (e instanceof FirebaseTooManyRequestsException) {
                Log.d("JEJE", "Too many Request");
                Intent intent = new Intent();
                intent.putExtra("result","Too many Request");
                intent.putExtra("phone",phoneNumber);
                setResult(REQ_CODE,intent);
            }
            showSnakBar(e.toString());
            //hideProgressDialog();
            Constant.hideProgressBar();
            Toast.makeText(PhoneVerification.this, "Failed", Toast.LENGTH_SHORT).show();
            finish();
        }
        @Override
        public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
            super.onCodeSent(s, forceResendingToken);
            //hideProgressDialog();
            Constant.hideProgressBar();
            Log.d("JEJE", "onCodeSent:" + s);
            mResendToken = forceResendingToken;
            tv.setText("We have sent a verification Code to your number "+phoneNumber+" via SMS.\nEnter the CODE bellow");
            phoneNumLayout.setVisibility(View.GONE);
            otpLayout.setVisibility(View.VISIBLE);
            verifyToken = s;
            showTimer();
        }
    };

verifyPhone() 中显示进度条后应用程序崩溃。未发送任何代码。

【问题讨论】:

  • 分享相关代码
  • 您确定此错误与版本有关吗?
  • NullPointerException。发布您的Opening_Screen.java 文件。
  • @Nilu 不,不是。幸运的是,我知道 NullPointerException 是什么。
  • @Xenolion 你是对的。此错误与版本无关。我弄错了

标签: android firebase-authentication android-permissions


【解决方案1】:

IMO 你必须将正确的key,value 对传递给intent.puExtra() 试试下面的代码

intent.putExtra("result",55);

那么你的data.getStringExtra("result"); 获得价值

 if (requestCode == 55){
            String result = data.getStringExtra("result");

试试下面的代码,这可能会有所帮助

Intent intent = new Intent(Opening_Screen.this,PhoneVerification.class);
intent.putExtra(Constant.REQUEST_CODE,55);
intent.putExtra("result",YOUR_RESULT_STRING);
intent.putExtra("phone",PHONE_STRING);
startActivityForResult(intent,55);

更多请查看this link

【讨论】:

  • 我认为这不是问题。我的代码在调试模式下运行良好。如果我错了请纠正我
  • @SayannPoria 分享行号:Opening_Screen.java 的第 108 行
  • String result = data.getStringExtra("result");
【解决方案2】:

在添加@Omi 的答案后,这是您需要添加的另一个条件。

if (requestCode == 55 && data!=null){
  //here your code
}

希望得到帮助。

【讨论】:

    【解决方案3】:

    转到设置->开发者选项->应用程序部分& 确保您的“不保留活动”选项处于关闭状态,然后尝试

    【讨论】:

      【解决方案4】:

      嗯,问题已经解决了

      我对问题的理解是错误的。问题不是因为Android版本。每个版本都会出现问题。

      原因

      正如我所描述的,该应用程序在调试模式下工作正常,但在发布模式下不工作。我使用了 Firebase 电话身份验证。并且需要SHA certificate fingerprints。不幸的是,我忘记提供版本 SHA-1。我在发布版本中使用了调试 SHA-1 指纹。

      解决方案

      提供了发布版 SHA-1 指纹。

      【讨论】:

      • 很高兴您解决了您的问题@Sayann,恭喜您,感谢您的回答!
      • 您好,如何获取发布版 SHA-1 指纹
      • 你可以在这里找到它stackoverflow.com/questions/34933380/…
      • 我们是否需要再次更新 google-services.json 并推出新版本的应用?
      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2021-04-26
      • 2020-10-04
      • 2021-10-03
      • 2018-03-22
      • 2019-09-11
      相关资源
      最近更新 更多