如何封装Firebase PhoneAuthProvider回调类并添加参数实现整洁代码
封装Firebase PhoneAuth回调并传递自定义参数
1. 定义自定义回调接口
先创建一个接口,用来传递验证流程中的关键事件和数据,让调用方(比如Activity/Fragment)处理具体业务逻辑:
public interface PhoneAuthCallbackListener { // 验证完成,返回短信验证码 void onVerificationCompleted(String smsCode); // 验证码发送成功,返回验证ID和重发Token void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken resendingToken); // 验证失败,返回异常信息 void onVerificationFailed(FirebaseException e); }
2. 封装独立的PhoneAuth回调类
创建一个继承自PhoneAuthProvider.OnVerificationStateChangedCallbacks的类,通过构造函数注入自定义接口实例,将原生回调的事件转发给接口,同时用弱引用避免内存泄漏:
public class CustomPhoneAuthCallbacks extends PhoneAuthProvider.OnVerificationStateChangedCallbacks { private final WeakReference<PhoneAuthCallbackListener> mListenerWeakRef; public CustomPhoneAuthCallbacks(PhoneAuthCallbackListener listener) { mListenerWeakRef = new WeakReference<>(listener); } @Override public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) { String smsCode = credential.getSmsCode(); if (smsCode != null && mListenerWeakRef.get() != null) { mListenerWeakRef.get().onVerificationCompleted(smsCode); } } @Override public void onVerificationFailed(@NonNull FirebaseException e) { if (mListenerWeakRef.get() != null) { mListenerWeakRef.get().onVerificationFailed(e); } } @Override public void onCodeSent(@NonNull String verificationId, @NonNull PhoneAuthProvider.ForceResendingToken token) { super.onCodeSent(verificationId, token); if (mListenerWeakRef.get() != null) { mListenerWeakRef.get().onCodeSent(verificationId, token); } } }
3. 在业务类中使用封装后的回调
以RegistrationActivity为例,实现自定义接口并创建封装类实例,传入Firebase验证流程:
public class RegistrationActivity extends AppCompatActivity implements PhoneAuthCallbackListener { private String verificationID; private CustomPhoneAuthCallbacks mPhoneAuthCallbacks; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_registration); // 初始化封装后的回调 mPhoneAuthCallbacks = new CustomPhoneAuthCallbacks(this); } // 启动Firebase手机号验证的示例方法 private void startPhoneVerification(String phoneNumber) { PhoneAuthOptions options = PhoneAuthOptions.newBuilder(FirebaseAuth.getInstance()) .setPhoneNumber(phoneNumber) .setTimeout(60L, TimeUnit.SECONDS) .setActivity(this) .setCallbacks(mPhoneAuthCallbacks) // 传入封装后的回调 .build(); PhoneAuthProvider.verifyPhoneNumber(options); } // 实现自定义接口方法,处理自身业务逻辑 @Override public void onVerificationCompleted(String smsCode) { verifycode(smsCode); } @Override public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken resendingToken) { verificationID = verificationId; Toast.makeText(this, "Code sent", Toast.LENGTH_SHORT).show(); // btnJoinNl.setEnabled(true); // codeFunc(verificationId); // bar.setVisibility(View.INVISIBLE); } @Override public void onVerificationFailed(FirebaseException e) { Toast.makeText(this, "验证失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } // 原有的验证码验证方法 private void verifycode(String code) { // 你的验证逻辑 } }
4. 扩展:传递更多自定义参数
如果需要传递额外参数(比如业务标识、特定View等),可以修改封装类的构造函数和接口方法:
- 修改接口增加参数:
public interface PhoneAuthCallbackListener { void onVerificationCompleted(String smsCode, String businessTag); // 其他方法同理扩展 }
- 修改封装类构造函数和转发逻辑:
public class CustomPhoneAuthCallbacks extends PhoneAuthProvider.OnVerificationStateChangedCallbacks { private final WeakReference<PhoneAuthCallbackListener> mListenerWeakRef; private final String mBusinessTag; // 自定义参数 public CustomPhoneAuthCallbacks(PhoneAuthCallbackListener listener, String businessTag) { mListenerWeakRef = new WeakReference<>(listener); mBusinessTag = businessTag; } @Override public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) { String smsCode = credential.getSmsCode(); if (smsCode != null && mListenerWeakRef.get() != null) { mListenerWeakRef.get().onVerificationCompleted(smsCode, mBusinessTag); } } // 其他方法... }
- 使用时传入参数:
mPhoneAuthCallbacks = new CustomPhoneAuthCallbacks(this, "REGISTRATION");
内容的提问来源于stack exchange,提问作者N MZ
相关产品推荐
相关产品推荐

