如何在React Native中检测双卡(SIM1、SIM2)通话是否设为“始终询问”
React Native 检测双卡通话默认设置是否为“始终询问”
由于 React Native 核心库没有提供双卡通话设置的直接检测接口,需要通过原生模块扩展实现,以下分平台说明具体方案:
Android 实现方案
Android 系统提供了双卡订阅管理的 API,可通过检测默认通话订阅 ID 判断是否设置为“始终询问”。
1. 创建 Android 原生模块
在项目 android/app/src/main/java/com/[你的项目包名]/ 路径下,新建 SimCallSettingModule.java 文件:
package com.yourprojectname; import android.content.Context; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.os.Build; import androidx.annotation.NonNull; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.Promise; public class SimCallSettingModule extends ReactContextBaseJavaModule { private final ReactApplicationContext reactContext; public SimCallSettingModule(ReactApplicationContext reactContext) { super(reactContext); this.reactContext = reactContext; } @NonNull @Override public String getName() { return "SimCallSetting"; } @ReactMethod public void isCallAlwaysAsk(Promise promise) { try { Context context = reactContext; TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 默认订阅ID为INVALID_SUBSCRIPTION_ID时,说明系统设置为“始终询问” int defaultCallSubId = telephonyManager.getDefaultSubscriptionId(); boolean isAlwaysAsk = defaultCallSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID; promise.resolve(isAlwaysAsk); } else { // Android N以下版本不支持双卡默认设置检测,返回false promise.resolve(false); } } catch (Exception e) { promise.reject("DETECTION_ERROR", e.getMessage()); } } }
2. 注册原生模块
同路径下新建 SimCallSettingPackage.java 文件:
package com.yourprojectname; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SimCallSettingPackage implements ReactPackage { @NonNull @Override public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new SimCallSettingModule(reactContext)); return modules; } @NonNull @Override public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) { return Collections.emptyList(); } }
3. 配置 MainApplication
修改 MainApplication.java 的 getPackages 方法,添加自定义模块包:
@Override protected List<ReactPackage> getPackages() { List<ReactPackage> packages = new PackageList(this).getPackages(); // 加入自定义双卡设置检测包 packages.add(new SimCallSettingPackage()); return packages; }
React Native 端调用
创建工具函数文件 simCallSetting.js:
import { NativeModules } from 'react-native'; const { SimCallSetting } = NativeModules; /** * 检测通话默认设置是否为“始终询问” * @returns {boolean} 选中返回true,未选中返回false */ export const isCallAlwaysAsk = async () => { try { return await SimCallSetting.isCallAlwaysAsk(); } catch (error) { console.error('检测通话设置失败:', error); return false; } };
在组件中使用示例:
import React, { useEffect, useState } from 'react'; import { View, Text } from 'react-native'; import { isCallAlwaysAsk } from './simCallSetting'; const App = () => { const [alwaysAskStatus, setAlwaysAskStatus] = useState(false); useEffect(() => { checkCallSetting(); }, []); const checkCallSetting = async () => { const status = await isCallAlwaysAsk(); setAlwaysAskStatus(status); }; return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>通话默认设置:{alwaysAskStatus ? '"始终询问"' : '指定SIM卡'}</Text> </View> ); }; export default App;
iOS 说明
iOS 双卡(物理SIM + eSIM)的通话设置逻辑与 Android 不同,系统没有提供直接检测“始终询问”状态的公开 API。若需实现类似功能,只能引导用户前往系统设置界面查看,或通过通话行为间接判断,但无法直接获取设置状态。
内容的提问来源于stack exchange,提问作者Mathew Azmat
相关产品推荐
相关产品推荐

