You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何封装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:55:30