Browse Source

[New]上传文件新增前台任务

zhipeng 1 year ago
parent
commit
1243fea42d
2 changed files with 69 additions and 1 deletions
  1. 35 1
      lib/data/repositories/talk_repository.dart
  2. 34 0
      lib/utils/foreground_util.dart

+ 35 - 1
lib/data/repositories/talk_repository.dart

@@ -5,9 +5,10 @@ import 'package:electronic_assistant/data/api/atmob_file_api.dart';
 import 'package:electronic_assistant/data/api/request/talk_create_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_create_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_delete_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_delete_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_file_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_file_request.dart';
-import 'package:flutter/cupertino.dart';
+import 'package:flutter_foreground_task/flutter_foreground_task.dart';
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 
 
+import '../../utils/foreground_util.dart';
 import '../../utils/http_handler.dart';
 import '../../utils/http_handler.dart';
 import '../api/request/talk_generate_request.dart';
 import '../api/request/talk_generate_request.dart';
 import '../api/request/talk_paginate_request.dart';
 import '../api/request/talk_paginate_request.dart';
@@ -145,6 +146,11 @@ class TalkRepository {
 
 
   Future<String> uploadTalkFile(String talkId, double duration, File file) {
   Future<String> uploadTalkFile(String talkId, double duration, File file) {
     _uploadingTalkIds.add(talkId);
     _uploadingTalkIds.add(talkId);
+    startForegroundService(
+        serviceId: talkId.hashCode,
+        notificationTitle: '正在上传录音',
+        notificationText: '请勿关闭应用',
+        callback: setUploadCallback);
     _uploadingTalkProgress[talkId] = RxDouble(0);
     _uploadingTalkProgress[talkId] = RxDouble(0);
     return atmobFileApi
     return atmobFileApi
         .uploadTalkFile(TalkFileRequest(talkId, duration, file: file).toJson(),
         .uploadTalkFile(TalkFileRequest(talkId, duration, file: file).toJson(),
@@ -163,6 +169,9 @@ class TalkRepository {
         .catchError((error) {
         .catchError((error) {
           _uploadingTalkIds.remove(talkId);
           _uploadingTalkIds.remove(talkId);
           throw error;
           throw error;
+        })
+        .whenComplete(() {
+          stopForegroundService();
         });
         });
   }
   }
 
 
@@ -174,4 +183,29 @@ class TalkRepository {
   }
   }
 }
 }
 
 
+class UploadTaskHandler extends TaskHandler {
+  @override
+  Future<void> onDestroy(DateTime timestamp) {
+    // TODO: implement onDestroy
+    return Future.value();
+  }
+
+  @override
+  void onRepeatEvent(DateTime timestamp) {
+    // TODO: implement onRepeatEvent
+  }
+
+  @override
+  Future<void> onStart(DateTime timestamp, TaskStarter starter) {
+    // TODO: implement onStart
+    return Future.value();
+  }
+}
+
+@pragma('vm:entry-point')
+void setUploadCallback() {
+  // The setTaskHandler function must be called to handle the task in the background.
+  FlutterForegroundTask.setTaskHandler(UploadTaskHandler());
+}
+
 final talkRepository = TalkRepository._();
 final talkRepository = TalkRepository._();

+ 34 - 0
lib/utils/foreground_util.dart

@@ -0,0 +1,34 @@
+import 'package:flutter_foreground_task/flutter_foreground_task.dart';
+
+Future<ServiceRequestResult> startForegroundService({
+  int? serviceId,
+  required String notificationTitle,
+  required String notificationText,
+  NotificationIconData? notificationIcon,
+  List<NotificationButton>? notificationButtons,
+  required Function callback,
+}) async {
+  final NotificationPermission notificationPermission =
+      await FlutterForegroundTask.checkNotificationPermission();
+  if (notificationPermission != NotificationPermission.granted) {
+    await FlutterForegroundTask.requestNotificationPermission();
+  }
+  if (await FlutterForegroundTask.isRunningService) {
+    return FlutterForegroundTask.restartService();
+  } else {
+    return FlutterForegroundTask.startService(
+      serviceId: serviceId,
+      notificationTitle: notificationTitle,
+      notificationText: notificationText,
+      notificationIcon: notificationIcon,
+      notificationButtons: notificationButtons,
+      callback: callback,
+    );
+  }
+}
+
+Future<void> stopForegroundService() async {
+  if (await FlutterForegroundTask.isRunningService) {
+    FlutterForegroundTask.stopService();
+  }
+}