Flutter如何实现新增手机通话记录
在Flutter中如何实现新增手机通话记录的功能?我需要在应用中模拟添加通话记录到系统通话日志中,但不知道如何调用原生API或是否有现成的插件支持。是否必须通过平台通道与Android/iOS原生代码交互?有哪些权限需要申请?希望能得到具体实现步骤或推荐的可用于生产环境的解决方案。
2 回复
Flutter无法直接新增手机通话记录,需通过平台通道调用原生代码。Android使用CallLog.Calls和ContentResolver,iOS需私有API(App Store审核不通过)。建议仅用于系统应用或越狱设备。
更多关于Flutter如何实现新增手机通话记录的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中实现新增手机通话记录需要使用平台通道(Platform Channels)调用原生代码,因为Flutter本身无法直接操作系统通话记录。
以下是实现步骤:
1. 添加权限(Android)
在 android/app/src/main/AndroidManifest.xml 中添加权限:
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
2. 实现Android原生代码
创建 CallLogHelper.java:
import android.content.ContentValues;
import android.content.Context;
import android.provider.CallLog;
public class CallLogHelper {
public static void addCallLog(Context context, String number, int type, long duration) {
ContentValues values = new ContentValues();
values.put(CallLog.Calls.NUMBER, number);
values.put(CallLog.Calls.TYPE, type);
values.put(CallLog.Calls.DATE, System.currentTimeMillis());
values.put(CallLog.Calls.DURATION, duration);
values.put(CallLog.Calls.NEW, 1);
context.getContentResolver().insert(CallLog.Calls.CONTENT_URI, values);
}
}
3. 创建Method Channel
在MainActivity中设置平台通道:
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "call_log_channel";
@Override
public void configureFlutterEngine(FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler((call, result) -> {
if (call.method.equals("addCallLog")) {
String number = call.argument("number");
int type = call.argument("type");
long duration = call.argument("duration");
CallLogHelper.addCallLog(this, number, type, duration);
result.success(null);
} else {
result.notImplemented();
}
});
}
}
4. Flutter端调用
在Dart文件中:
import 'package:flutter/services.dart';
class CallLogService {
static const platform = MethodChannel('call_log_channel');
static Future<void> addCallLog({
required String number,
required int type, // 1=来电, 2=去电, 3=未接
required int duration,
}) async {
try {
await platform.invokeMethod('addCallLog', {
'number': number,
'type': type,
'duration': duration,
});
} on PlatformException catch (e) {
print("Failed to add call log: '${e.message}'");
}
}
}
// 使用示例
await CallLogService.addCallLog(
number: '13800138000',
type: 2, // 去电
duration: 60, // 通话时长(秒)
);
重要注意事项:
- 权限处理:需要动态申请
WRITE_CALL_LOG权限 - iOS限制:iOS不允许应用写入通话记录,此功能仅适用于Android
- 类型说明:
- 1:来电(INCOMING)
- 2:去电(OUTGOING)
- 3:未接(MISSED)
建议在实际使用前先检查权限状态,并处理用户拒绝权限的情况。

