Flutter如何在Android端获取通话记录并在iOS端跳过对应逻辑
通话记录读取跨端实现方案
前提说明
- Android 6.0及以上需要动态申请
READ_CALL_LOG权限,只要用户授权即可正常读取通话记录 - iOS未对外开放通话记录读取的公共API,调用私有API会被App Store审核拒绝,因此直接跳过该模块逻辑即可
核心实现代码
1. 原生端实现
Android 端
首先在AndroidManifest.xml中注册权限:
<uses-permission android:name="android.permission.READ_CALL_LOG" />
读取通话记录核心逻辑(Kotlin):
// 权限校验 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_GRANTED) { // 按通话时间倒序查询记录 val callLogCursor = contentResolver.query( CallLog.Calls.CONTENT_URI, arrayOf(CallLog.Calls.NUMBER, CallLog.Calls.DATE, CallLog.Calls.DURATION, CallLog.Calls.TYPE), null, null, "${CallLog.Calls.DATE} DESC" ) callLogCursor?.use { cursor -> while (cursor.moveToNext()) { val number = cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.NUMBER)) val callTime = cursor.getLong(cursor.getColumnIndexOrThrow(CallLog.Calls.DATE)) val duration = cursor.getLong(cursor.getColumnIndexOrThrow(CallLog.Calls.DURATION)) val callType = cursor.getInt(cursor.getColumnIndexOrThrow(CallLog.Calls.TYPE)) // 自行处理拿到的通话记录字段 } } } else { // 动态申请权限 ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CALL_LOG), 1001) }
iOS 端
业务逻辑入口直接加判断跳过即可,无额外实现:
// iOS不支持通话记录读取,直接返回 #if os(iOS) return #endif
2. 跨端框架示例(Flutter)
import 'dart:io'; import 'package:permission_handler/permission_handler.dart'; import 'package:call_log/call_log.dart'; Future<void> getCallRecords() async { // iOS端直接跳过逻辑 if (Platform.isIOS) return; // Android端先申请权限再读取 if (await Permission.phone.request().isGranted) { Iterable<CallLogEntry> records = await CallLog.get(); // 处理获取到的通话记录列表 } }
注意:Android端读取通话记录属于敏感权限,上架应用商店时需要明确告知用户权限使用场景,符合隐私合规要求。
内容的提问来源于stack exchange,提问作者SangamMahale
相关产品推荐
相关产品推荐

