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'); } };
崩溃原因分析
- 权限未授权时强行读取联系人:安卓端申请权限后,无论用户是否授权都直接调用
loadContacts,拒绝权限时调用getAll()会触发崩溃 - 未处理回调未定义的情况:如果调用时未传入
callback,直接执行callback(contacts)会抛出类型错误,导致应用崩溃 - 异步逻辑不严谨:权限请求的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
相关产品推荐
相关产品推荐

