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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:42:50