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

React Native安卓端使用react-native-contacts时应用频繁崩溃求助

React Native Contacts安卓端崩溃问题修复

问题描述

使用react-native-contacts实现联系人读取功能,iOS端运行正常,但安卓端每次调用都会导致应用崩溃,相关代码如下:

export const loadContacts = (callback?: any) => {
  getAll().then(contacts => {
    callback(contacts);
  });
};

export const requestContactsPermission = (callback?: any) => {
  if (isAndroid) {
    PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.READ_CONTACTS, {
      title: 'Contacts',
      message: 'This app would like to view your contacts.',
      buttonPositive: 'Please accept',
    }).then(res => {
      loadContacts(callback);
    });
  } else {
    loadContacts(callback);
  }
};

export const checkContactsPermission = async () => {
  if (isAndroid) {
    const isPermissionGranted = await PermissionsAndroid.check(
      PermissionsAndroid.PERMISSIONS.READ_CONTACTS,
    );
    console.log('permi granted android', isPermissionGranted);
    return isPermissionGranted;
  } else {
    const isPermissionGranted = await checkPermission();
    console.log('permi granted ios', isPermissionGranted);
    return !!(isPermissionGranted === 'authorized');
  }
};

崩溃原因分析

  1. 权限未授权时强行读取联系人:安卓端申请权限后,无论用户是否授权都直接调用loadContacts,拒绝权限时调用getAll()会触发崩溃
  2. 未处理回调未定义的情况:如果调用时未传入callback,直接执行callback(contacts)会抛出类型错误,导致应用崩溃
  3. 异步逻辑不严谨:权限请求的Promise未处理拒绝分支,可能引发未捕获异常

修复后的代码

import { PermissionsAndroid, Platform } from 'react-native';
import { getAll, checkPermission } from 'react-native-contacts';

const isAndroid = Platform.OS === 'android';

export const loadContacts = (callback?: (contacts: any[]) => void) => {
  // 先校验回调是否存在,避免调用undefined导致崩溃
  if (!callback) return;
  
  getAll()
    .then(contacts => {
      callback(contacts);
    })
    .catch(error => {
      console.error('读取联系人失败:', error);
      callback([]); // 返回空数组,根据业务需求调整
    });
};

export const requestContactsPermission = (callback?: (contacts: any[]) => void) => {
  if (isAndroid) {
    PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.READ_CONTACTS, {
      title: '联系人权限申请',
      message: '应用需要访问您的联系人信息以提供相关功能',
      buttonPositive: '允许',
      buttonNegative: '取消',
    })
    .then(permissionStatus => {
      // 仅在权限授权成功时读取联系人
      if (permissionStatus === PermissionsAndroid.RESULTS.GRANTED) {
        loadContacts(callback);
      } else {
        console.log('联系人权限被拒绝');
        callback?.([]);
      }
    })
    .catch(error => {
      console.error('权限申请失败:', error);
      callback?.([]);
    });
  } else {
    loadContacts(callback);
  }
};

export const checkContactsPermission = async () => {
  if (isAndroid) {
    try {
      const isPermissionGranted = await PermissionsAndroid.check(
        PermissionsAndroid.PERMISSIONS.READ_CONTACTS,
      );
      console.log('安卓联系人权限状态:', isPermissionGranted);
      return isPermissionGranted;
    } catch (error) {
      console.error('检查安卓权限失败:', error);
      return false;
    }
  } else {
    try {
      const isPermissionGranted = await checkPermission();
      console.log('iOS联系人权限状态:', isPermissionGranted);
      return isPermissionGranted === 'authorized';
    } catch (error) {
      console.error('检查iOS权限失败:', error);
      return false;
    }
  }
};

关键修复点说明

  • 权限判断严谨化:安卓端权限请求后,仅当状态为PermissionsAndroid.RESULTS.GRANTED时才调用读取联系人方法
  • 异常捕获全覆盖:为getAll()、权限请求和权限检查添加catch分支,捕获并处理所有可能的异常
  • 安全性校验:调用回调前先判断是否存在,避免因未传入回调导致的类型错误
  • 日志完善:添加更清晰的错误日志,便于问题排查

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:27:33