无法在后台获取通话记录(颤振)

时间:2020-07-22 17:53:59

标签: android flutter dart android-permissions background-process

我可以使用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();
    }
  }
  .......
  .......
}

这是在后台获取通话记录期间的错误:

enter image description here

错误,尝试在null对象引用null上调用虚拟方法'int android.app.Activity.checkSelfPermission(java.lang.String)'

1 个答案:

答案 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