Flutter日志记录插件call_e_log的使用
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
, name
和 number
。字符串参数使用 LIKE
和 %
通配符进行查询。
已弃用API的注意事项
该插件仍然保持与v1嵌入版本的向后兼容性,这意味着在发布构建时gradle会报告已弃用API的使用。当flutter在未来的一个版本中移除v1嵌入时,我们将移除向后兼容性。
后台执行
该插件可以在flutter后台引擎中使用,通过类似WorkManager这样的插件。但请注意,插件在后台执行时无法请求权限。你必须手动请求 READ_CALL_LOG
和 READ_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),
),
],
),
),
),
);
}
}
说明
-
导入包:
import 'package:call_e_log/call_log.dart';
-
获取整个通话记录:
Iterable<CallLogEntry> entries = await CallLog.get();
-
查询通话记录(所有参数都是可选的):
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, );
-
获取并显示通话记录:
Iterable<CallLogEntry> entries = await CallLog.query(); setState(() { _callLogEntries = entries; });
-
注册后台任务:
Workmanager().registerOneOffTask( DateTime.now().millisecondsSinceEpoch.toString(), 'simpleTask', existingWorkPolicy: ExistingWorkPolicy.replace, );
更多关于Flutter日志记录插件call_e_log的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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
插件进行基本的日志记录。根据你的实际需求,你可以进一步自定义和扩展日志记录功能。