flutter background 앱 전환시에도 음성 재생되게 하기

Gmini.Y·2024년 1월 15일
  1. android menifest setup

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example">
      ...
      <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    	<uses-permission android:name="android.permission.FOREGROUND_SERVICE_FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
      <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
      <application
            android:label="example"
            android:name="${applicationName}"
            android:icon="@mipmap/ic_launcher"
            ...>
    
            <activity
                android:name=".MainActivity"
                android:exported="true"
                ...>
    
    				<service
                android:name="com.jimin.flutter_web_rtc_new_test.MyApp"
                android:foregroundServiceType="mediaPlayback"
                />
  1. buildGradle

    compileSdkVersion 34
  2. Info.plist

    <key>BGTaskSchedulerPermittedIdentifiers</key>
    <array>
    	<string>com.jimin.flutterWebRtcNewTest.refresh</string>
    </array>
  3. xcode background mode enable

  1. dependency 설치 (버전 중요함. 버전 안맞으면 에러)

    flutter_background_service: 5.0.2
      flutter_background_service_android: 6.1.0
      flutter_background_service_ios: ^5.0.0
      flutter_local_notifications: ^16.3.0
  2. main.dart Full code

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:flutter_background_service_android/flutter_background_service_android.dart';

const AndroidNotificationChannel channel = AndroidNotificationChannel(
    'high_importance_channel', // id
    'High Importance Notifications', // title
    description:
    'This channel is used for important notifications.', // description
    importance: Importance.high,
    playSound: true);

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await initializeService();
  runApp(MyApp());
}

Future<void> initializeService() async {
  final service = FlutterBackgroundService();
  if (Platform.isIOS || Platform.isAndroid) {
    await flutterLocalNotificationsPlugin.initialize(
      const InitializationSettings(
        iOS: DarwinInitializationSettings(),
        android: AndroidInitializationSettings('ic_bg_service_small'),
      ),
    );
  }

  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
      AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  await service.configure(
    androidConfiguration: AndroidConfiguration(
      onStart: onStart,
      autoStart: true,
      isForegroundMode: false, // true is foreground and background enabled, false is only background service will enable
      notificationChannelId: 'my_foreground',
      initialNotificationContent: 'running',
      foregroundServiceNotificationId: 888,
    ),
    iosConfiguration: IosConfiguration(
      autoStart: true,
      onForeground: onStart,
      onBackground: onIosBackground,
    ),
  );
}

('vm:entry-point')
Future<bool> onIosBackground(ServiceInstance service) async {
  WidgetsFlutterBinding.ensureInitialized();
  DartPluginRegistrant.ensureInitialized();
  return true;
}

('vm:entry-point')
void onStart(ServiceInstance service) async {
  DartPluginRegistrant.ensureInitialized();
  if (service is AndroidServiceInstance) {
    // service.on('setAsForeground').listen((event) {
    //   service.setAsForegroundService();
    // });
    service.on('setAsBackground').listen((event) {
      service.setAsBackgroundService();
    });
  }
  service.on('stopService').listen((event) {
    service.stopSelf();
  });
}

1개의 댓글

comment-user-thumbnail
2024년 1월 15일

잘 보고 갑니다

답글 달기