我已经实现了一个 React Native 模块(PhoneNumberHintModule)来使用 Smart Lock for Passwords API 检索电话号码。本机模块似乎已正确实现,并且我已在 React Native 代码中添加了必要的事件侦听器。但是,我遇到了电话号码未成功检索的问题。
这是我的 PhoneNumberHintModule 本机模块代码:
public class PhoneNumberHintModule extends ReactContextBaseJavaModule {
private static ReactApplicationContext reactContext;
private static final int CREDENTIAL_PICKER_REQUEST = 1;
private static Promise mPromise;
private static final String EVENT_PHONE_NUMBER_SELECTED = "phoneNumberSelected";
private final BaseActivityEventListener activityEventListener = new BaseActivityEventListener() {
@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
PhoneNumberHintModule.this.onActivityResult(requestCode, resultCode, data);
}
};
public PhoneNumberHintModule(ReactApplicationContext context) {
super(context);
reactContext = context;
if (reactContext != null) {
reactContext.addActivityEventListener(activityEventListener);
}
}
@NonNull
@Override
public String getName() {
return "PhoneNumberHintModule";
}
@ReactMethod
public void getPhoneNumberHint(final Promise promise) {
mPromise = promise;
final Activity currentActivity = getCurrentActivity();
if (currentActivity == null) {
promise.reject("ACTIVITY_NOT_AVAILABLE", "Activity is not available");
return;
}
Context context = getReactApplicationContext();
HintRequest hintRequest = new HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build();
IntentSender intent = Credentials.getClient(context).getHintPickerIntent(hintRequest).getIntentSender();
try {
currentActivity.startIntentSenderForResult(
intent,
CREDENTIAL_PICKER_REQUEST,
null,
0,
0,
0,
new Bundle()
);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
sendErrorToReactNative("SEND_INTENT_ERROR", e.getMessage());
}
}
private void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CREDENTIAL_PICKER_REQUEST) {
if (resultCode == Activity.RESULT_OK) {
handleCredentialResult(data);
} else {
sendErrorToReactNative("RESULT_NOT_OK", "Result code is not OK");
}
}
}
private void handleCredentialResult(Intent data) {
if (data != null) {
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
if (credential != null) {
String phoneNumber = credential.getId();
if (phoneNumber != null) {
emitPhoneNumberSelectedEvent(phoneNumber);
if (mPromise != null) {
mPromise.resolve(phoneNumber);
}
} else {
sendErrorToReactNative("PHONE_NUMBER_NULL", "Phone number is null");
}
} else {
sendErrorToReactNative("CREDENTIAL_NULL", "Credential is null");
}
} else {
sendErrorToReactNative("DATA_NULL", "Intent data is null");
}
}
private void emitPhoneNumberSelectedEvent(String phoneNumber) {
if (reactContext != null) {
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(EVENT_PHONE_NUMBER_SELECTED, phoneNumber);
}
}
private void sendErrorToReactNative(String code, String message) {
if (mPromise != null) {
mPromise.reject(code, message);
}
}
}
这是我的 React Native 代码:
useEffect(() => {
const subscription = phoneNumberHintModuleEventEmitter.addListener(
'phoneNumberSelected',
phoneNumber => {
console.log('Received phone number:', phoneNumber);
},
);
return () => {
subscription.remove();
};
}, []);
const handleOpenHint = async () => {
try {
const phoneNumber = await PhoneNumberHintModule.getPhoneNumberHint();
console.log('Selected phone number:', phoneNumber);
} catch (error) {
console.error('Error fetching phone number hint:', error);
}
};
我在 React Native 代码中添加了事件监听器来监听 'phoneNumberSelected' 事件,但回调没有被触发。
我怀疑这个问题可能与本机模块或我在 React Native 中处理事件的方式有关。有人可以查看我的代码并提供有关为何无法成功检索电话号码的见解吗?
预先感谢您的协助!
我认为您在
PhoneNumberHintModule.java
中缺少监听方法。
在我的代码中,当我删除此块代码时,我的回调也不会返回任何响应。
您可以将此代码粘贴到
getName
下面的PhoneNumberHintModule.java
中
@ReactMethod
public void addListener(String eventName) {
// Required for addListener.
}
@ReactMethod
public void removeListeners(Integer count) {
// Required for addListener.
}