Firebase phone 身份验证在调试模式下工作正常,但应用程序在发布时崩溃
Firebase phone authentication is working fine in debug mode but the app is crashing in release
是不是权限问题?
我在 运行 时授予了 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
代码很长,我正在解释它是如何工作的。
当它开始时,我正在检查 marshmallow 的权限,然后在授予所有权限后,phone 数字被作为用户的输入,然后它会转到 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()
中显示进度条后崩溃。没有发送代码。
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
添加@Omi 的回答后,这是您需要输入的另一个条件。
if (requestCode == 55 && data!=null){
//here your code
}
希望对您有所帮助。
转到设置-> 开发人员选项-> 应用程序 部分,然后
确保您的 'Do Not keep activities' 选项已关闭,然后尝试
嗯,问题已经解决。
我对问题的理解是错误的。问题不是因为 Android 版本。每个版本都会出现这个问题。
原因
正如我所描述的,该应用程序在调试模式下运行良好,但在发布模式下无法运行。我使用了 firebase phone 身份验证。并且需要SHA certificate fingerprints
。不幸的是,我忘记提供版本 SHA-1。我在发布版本中使用调试 SHA-1 指纹。
解决方案
提供释放 SHA-1 指纹。
是不是权限问题?
我在 运行 时授予了 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
代码很长,我正在解释它是如何工作的。
当它开始时,我正在检查 marshmallow 的权限,然后在授予所有权限后,phone 数字被作为用户的输入,然后它会转到 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()
中显示进度条后崩溃。没有发送代码。
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
添加@Omi 的回答后,这是您需要输入的另一个条件。
if (requestCode == 55 && data!=null){
//here your code
}
希望对您有所帮助。
转到设置-> 开发人员选项-> 应用程序 部分,然后 确保您的 'Do Not keep activities' 选项已关闭,然后尝试
嗯,问题已经解决。
我对问题的理解是错误的。问题不是因为 Android 版本。每个版本都会出现这个问题。
原因
正如我所描述的,该应用程序在调试模式下运行良好,但在发布模式下无法运行。我使用了 firebase phone 身份验证。并且需要SHA certificate fingerprints
。不幸的是,我忘记提供版本 SHA-1。我在发布版本中使用调试 SHA-1 指纹。
解决方案
提供释放 SHA-1 指纹。