Flutter如何实现新增手机通话记录

在Flutter中如何实现新增手机通话记录的功能?我需要在应用中模拟添加通话记录到系统通话日志中,但不知道如何调用原生API或是否有现成的插件支持。是否必须通过平台通道与Android/iOS原生代码交互?有哪些权限需要申请?希望能得到具体实现步骤或推荐的可用于生产环境的解决方案。

2 回复

Flutter无法直接新增手机通话记录,需通过平台通道调用原生代码。Android使用CallLog.CallsContentResolver,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, // 通话时长(秒)
);

重要注意事项:

  1. 权限处理:需要动态申请WRITE_CALL_LOG权限
  2. iOS限制:iOS不允许应用写入通话记录,此功能仅适用于Android
  3. 类型说明
    • 1:来电(INCOMING)
    • 2:去电(OUTGOING)
    • 3:未接(MISSED)

建议在实际使用前先检查权限状态,并处理用户拒绝权限的情况。

回到顶部