fix(android): phone-call
This commit is contained in:
parent
54083205f0
commit
52fc3bc24b
1 changed files with 68 additions and 13 deletions
|
|
@ -1,20 +1,75 @@
|
||||||
import { Platform, Linking } from "react-native";
|
import { Platform, Linking, PermissionsAndroid } from "react-native";
|
||||||
import RNImmediatePhoneCall from "react-native-immediate-phone-call";
|
import RNImmediatePhoneCall from "react-native-immediate-phone-call";
|
||||||
|
|
||||||
export function phoneCallEmergency() {
|
export async function phoneCallEmergency() {
|
||||||
const emergencyNumber = "112";
|
const emergencyNumber = "112";
|
||||||
|
|
||||||
if (Platform.OS === "ios") {
|
if (Platform.OS === "ios") {
|
||||||
// Use telprompt URL scheme on iOS
|
try {
|
||||||
Linking.openURL(`telprompt:${emergencyNumber}`).catch((err) => {
|
// Prefer telprompt on iOS for immediate prompt, fallback to tel
|
||||||
console.error("Error opening phone dialer:", err);
|
await Linking.openURL(`telprompt:${emergencyNumber}`);
|
||||||
// Fallback to regular tel: if telprompt fails
|
} catch (err) {
|
||||||
Linking.openURL(`tel:${emergencyNumber}`).catch((err) => {
|
console.error("Error opening phone dialer (iOS telprompt):", err);
|
||||||
console.error("Error opening phone dialer (fallback):", err);
|
try {
|
||||||
});
|
await Linking.openURL(`tel:${emergencyNumber}`);
|
||||||
});
|
} catch (err2) {
|
||||||
} else {
|
console.error("Error opening phone dialer (iOS tel fallback):", err2);
|
||||||
// Use RNImmediatePhoneCall on Android
|
}
|
||||||
RNImmediatePhoneCall.immediatePhoneCall(emergencyNumber);
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Android: request CALL_PHONE upfront and provide deterministic fallback
|
||||||
|
try {
|
||||||
|
const granted = await PermissionsAndroid.request(
|
||||||
|
PermissionsAndroid.PERMISSIONS.CALL_PHONE,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
|
||||||
|
// Try immediate call, but arm a short fallback timer in case the OS/OEM ignores ACTION_CALL
|
||||||
|
let fallbackTriggered = false;
|
||||||
|
|
||||||
|
const triggerFallback = async () => {
|
||||||
|
if (fallbackTriggered) return;
|
||||||
|
fallbackTriggered = true;
|
||||||
|
try {
|
||||||
|
await Linking.openURL(`tel:${emergencyNumber}`);
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Fallback to dialer failed:", e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Fire fallback after ~1.2s if nothing happens
|
||||||
|
const timer = setTimeout(triggerFallback, 1200);
|
||||||
|
|
||||||
|
try {
|
||||||
|
RNImmediatePhoneCall.immediatePhoneCall(emergencyNumber);
|
||||||
|
} catch (callErr) {
|
||||||
|
// If native throws synchronously, cancel timer and fallback immediately
|
||||||
|
clearTimeout(timer);
|
||||||
|
await triggerFallback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Give a little extra time; if no fallback was needed, clear the timer
|
||||||
|
setTimeout(() => {
|
||||||
|
if (!fallbackTriggered) clearTimeout(timer);
|
||||||
|
}, 3000);
|
||||||
|
} else {
|
||||||
|
// Permission denied or never-ask-again: open dialer prompt
|
||||||
|
try {
|
||||||
|
await Linking.openURL(`tel:${emergencyNumber}`);
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Permission denied; dialer fallback failed:", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("CALL_PHONE permission request failed:", err);
|
||||||
|
// Last resort: open dialer
|
||||||
|
try {
|
||||||
|
await Linking.openURL(`tel:${emergencyNumber}`);
|
||||||
|
} catch (err2) {
|
||||||
|
console.error("Dialer fallback failed after permission error:", err2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue