Flutter日志记录插件call_e_log的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter日志记录插件call_e_log的使用

call_e_log 是一个用于访问和查询通话历史记录的日志记录插件。目前该插件仅支持Android平台,因为iOS不提供访问通话历史记录的API。

使用方法

要使用此插件,需要在 pubspec.yaml 文件中添加依赖项:

dependencies:
  call_e_log: ^版本号

同时,你需要在 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

注意事项

该插件能够自动处理权限检查和请求。当前实现的查询参数包括 dateFrom, dateTo, durationFrom, durationTo, namenumber。字符串参数使用 LIKE% 通配符进行查询。

已弃用API的注意事项

该插件仍然保持与v1嵌入版本的向后兼容性,这意味着在发布构建时gradle会报告已弃用API的使用。当flutter在未来的一个版本中移除v1嵌入时,我们将移除向后兼容性。

后台执行

该插件可以在flutter后台引擎中使用,通过类似WorkManager这样的插件。但请注意,插件在后台执行时无法请求权限。你必须手动请求 READ_CALL_LOGREAD_PHONE_STATE 权限。

iOS支持情况

不幸的是,iOS不支持查询通话记录。更多信息可以参考这里

示例

以下是一个完整的示例代码,展示了如何使用 call_e_log 插件获取通话记录:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:call_e_log/call_log.dart';
import 'package:workmanager/workmanager.dart';

/// TOP-LEVEL FUNCTION PROVIDED FOR WORK MANAGER AS CALLBACK
void callbackDispatcher() {
  Workmanager().executeTask((dynamic task, dynamic inputData) async {
    print('Background Services are Working!');
    try {
      final Iterable<CallLogEntry> cLog = await CallLog.get();
      print('Queried call log entries');
      for (CallLogEntry entry in cLog) {
        print('-------------------------------------');
        print('F. NUMBER  : ${entry.formattedNumber}');
        print('C.M. NUMBER: ${entry.cachedMatchedNumber}');
        print('NUMBER     : ${entry.number}');
        print('NAME       : ${entry.name}');
        print('TYPE       : ${entry.callType}');
        print('DATE       : ${DateTime.fromMillisecondsSinceEpoch(entry.timestamp ?? 0)}');
        print('DURATION   : ${entry.duration}');
        print('ACCOUNT ID : ${entry.phoneAccountId}');
        print('SIM NAME   : ${entry.simDisplayName}');
        print('-------------------------------------');
      }
      return true;
    } on PlatformException catch (e, s) {
      print(e);
      print(s);
      return true;
    }
  });
}

void main() {
  runApp(MyApp());
  Workmanager().initialize(callbackDispatcher, isInDebugMode: true);
}

/// 示例widget用于展示call_log插件
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Iterable<CallLogEntry> _callLogEntries = <CallLogEntry>[];

  @override
  Widget build(BuildContext context) {
    const TextStyle mono = TextStyle(fontFamily: 'monospace');
    final List<Widget> children = [];
    for (CallLogEntry entry in _callLogEntries) {
      children.add(
        Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            const Divider(),
            Text('F. NUMBER  : ${entry.formattedNumber}', style: mono),
            Text('C.M. NUMBER: ${entry.cachedMatchedNumber}', style: mono),
            Text('NUMBER     : ${entry.number}', style: mono),
            Text('NAME       : ${entry.name}', style: mono),
            Text('TYPE       : ${entry.callType}', style: mono),
            Text('DATE       : ${DateTime.fromMillisecondsSinceEpoch(entry.timestamp ?? 0)}', style: mono),
            Text('DURATION   : ${entry.duration}', style: mono),
            Text('ACCOUNT ID : ${entry.phoneAccountId}', style: mono),
            Text('SIM NAME   : ${entry.simDisplayName}', style: mono),
          ],
        ),
      );
    }

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('call_log example')),
        body: SingleChildScrollView(
          child: Column(
            children: [
              Center(
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: ElevatedButton(
                    onPressed: () async {
                      final Iterable<CallLogEntry> result = await CallLog.query();
                      setState(() {
                        _callLogEntries = result;
                      });
                    },
                    child: const Text('获取所有'),
                  ),
                ),
              ),
              Center(
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: ElevatedButton(
                    onPressed: () {
                      Workmanager().registerOneOffTask(
                        DateTime.now().millisecondsSinceEpoch.toString(),
                        'simpleTask',
                        existingWorkPolicy: ExistingWorkPolicy.replace,
                      );
                    },
                    child: const Text('后台获取所有'),
                  ),
                ),
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Column(children: children),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

说明

  1. 导入包

    import 'package:call_e_log/call_log.dart';
    
  2. 获取整个通话记录

    Iterable<CallLogEntry> entries = await CallLog.get();
    
  3. 查询通话记录(所有参数都是可选的)

    var now = DateTime.now();
    int from = now.subtract(Duration(days: 60)).millisecondsSinceEpoch;
    int to = now.subtract(Duration(days: 30)).millisecondsSinceEpoch;
    Iterable<CallLogEntry> entries = await CallLog.query(
          dateFrom: from,
          dateTo: to,
          durationFrom: 0,
          durationTo: 60,
          name: 'shrikant',
          number: '810935000',
          type: CallType.incoming,
    );
    
  4. 获取并显示通话记录

    Iterable<CallLogEntry> entries = await CallLog.query();
    setState(() {
      _callLogEntries = entries;
    });
    
  5. 注册后台任务

    Workmanager().registerOneOffTask(
      DateTime.now().millisecondsSinceEpoch.toString(),
      'simpleTask',
      existingWorkPolicy: ExistingWorkPolicy.replace,
    );
    

更多关于Flutter日志记录插件call_e_log的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter日志记录插件call_e_log的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用call_e_log插件进行日志记录的代码示例。call_e_log是一个用于Flutter的日志记录插件,它可以帮助你方便地记录和管理应用的日志信息。

首先,你需要在你的pubspec.yaml文件中添加call_e_log依赖:

dependencies:
  flutter:
    sdk: flutter
  call_e_log: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中初始化并使用call_e_log插件。以下是一个完整的示例:

import 'package:flutter/material.dart';
import 'package:call_e_log/call_e_log.dart';

void main() {
  // 初始化call_e_log插件
  CallELog.init(
    enable: true,  // 是否启用日志记录
    level: CallELogLevel.debug,  // 设置日志级别
    filePath: "/sdcard/call_e_log/",  // 日志文件存储路径(Android示例路径,iOS需调整)
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter 日志记录示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                // 记录不同级别的日志
                CallELog.d('这是一条debug级别的日志');
                CallELog.i('这是一条info级别的日志');
                CallELog.w('这是一条warn级别的日志');
                CallELog.e('这是一条error级别的日志');

                // 也可以记录带有参数的日志
                var param = {'key': 'value'};
                CallELog.json('这是一条json格式的日志', param);

                // 输出日志到控制台(可选,用于调试)
                print('日志已记录');
              },
              child: Text('记录日志'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们首先初始化了call_e_log插件,设置了日志的启用状态、日志级别和日志文件存储路径。然后,在点击按钮时,我们记录了不同级别的日志,包括debug、info、warn和error级别。此外,我们还展示了如何记录带有参数的json格式日志。

请注意,日志文件的存储路径在Android和iOS上可能有所不同,你需要根据平台调整路径。同时,确保你的应用有权限写入指定的存储路径(例如,在Android上需要请求存储权限)。

这个示例展示了如何使用call_e_log插件进行基本的日志记录。根据你的实际需求,你可以进一步自定义和扩展日志记录功能。

回到顶部