我可以使用call_log
pub软件包在前景中获得 CallLog 。但是我需要在后台获取“呼叫记录”。
这是我的代码中的一些秘诀:
void main() {
runApp(MaterialApp(
home: Home(),
));
Workmanager.initialize(callbackDispatcher, isInDebugMode: true);
Workmanager.registerPeriodicTask("1", "simplePeriodicTask",
existingWorkPolicy: ExistingWorkPolicy.replace,
frequency: Duration(minutes: 15),
initialDelay:
Duration(seconds: 5),
constraints: Constraints(
networkType: NetworkType.connected,
));
}
void callbackDispatcher() {
Workmanager.executeTask((task, inputData) async{
await _HomeState().callLogDbManager();
print('Background Services are Working!');
return Future.value(true);
});
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
Future<void> callLogDbManager() async {
Iterable<CallLogEntry> cLog = await CallLog.get();
int rowCount = await DatabaseHelper.instance.queryRowCount();
int clLength = cLog.length;
if (rowCount >= clLength) {
callLogDbUpdate();
} else {
await callLogDbInsert();
callLogDbUpdate();
}
}
.......
.......
}
这是在后台获取通话记录期间的错误:
错误,尝试在null对象引用null上调用虚拟方法'int android.app.Activity.checkSelfPermission(java.lang.String)'
答案 0 :(得分:0)
这几乎是CallLog
插件的局限性。如您所见https://github.com/4Q-s-r-o/call_log/blob/af10fded3971b1c2065faa1813a9eeb993f3d9c4/android/src/main/java/sk/fourq/calllog/CallLogPlugin.java#L52,该插件需要一个有效的Activity
但是,老实说,我认为,尤其是由于CallLog访问是一个非常具体的Android问题,因此我并没有真正看到用flutter / dart编码逻辑的好处。也许您应该对应用程序的那部分进行本地化,特别是因为无论如何执行后台逻辑都会遇到问题。 Flutter对后台执行的支持仍然非常混乱:https://github.com/flutter/flutter/issues/32164