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

如何通过Expo获取设备电话号码?已尝试expo-contacts与expo-device未果

解决Expo获取当前设备电话号码的问题

首先明确:你之前用的expo-contacts是读取通讯录联系人,和本机号码无关;expo-device也没有提供获取本机号码的API,这就是你拿不到目标信息的原因。

核心限制说明

  • iOS:苹果出于隐私保护,完全禁止APP获取当前设备的电话号码,没有任何官方途径可以实现。
  • Android:部分设备允许获取,但需要READ_PHONE_STATE权限,且Expo的managed workflow没有封装对应的API,需要通过以下方式实现:

可行解决方案

方案1:使用expo-sms尝试获取(仅Android部分设备支持)

expo-sms提供了getPhoneNumberAsync方法,可尝试获取设备的默认短信发送号码,步骤如下:

  1. 安装依赖:
npx expo install expo-sms
  1. 代码实现:
import * as SMS from 'expo-sms';
import { useEffect } from 'react';

useEffect(() => {
  (async () => {
    const { status } = await SMS.requestPermissionsAsync();
    if (status === 'granted') {
      try {
        const phoneNumber = await SMS.getPhoneNumberAsync();
        console.log('本机号码:', phoneNumber);
      } catch (error) {
        console.log('无法获取号码:', error.message);
      }
    }
  })();
}, []);

注意:这个方法并非所有Android设备都支持,部分厂商会限制该权限返回空值。

方案2:切换到Bare Workflow或使用自定义开发插件(Android)

如果expo-sms无法满足需求,需要直接调用Android原生的TelephonyManager:

  1. 切换到bare workflow(若之前是managed workflow):
npx expo prebuild
  1. 在Android原生代码中实现获取号码的逻辑,或使用Expo开发插件封装该功能。
  2. 配置权限:在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

替代方案

如果必须获取用户的电话号码,最可靠的方式是让用户手动输入,然后通过短信验证码验证,这种方式不受系统限制,兼容性最好。

内容的提问来源于stack exchange,提问作者Jundev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:10:49