banuba_sdk 2.1.0 banuba_sdk: ^2.1.0 copied to clipboard
Banuba SDK for Flutter - full-scale augmented reality SDK | Flutter face filters | Virtual try-on | Background replacement | Face tracking
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:async';
import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
import 'package:banuba_sdk/banuba_sdk.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
final _banubaSdkManager = BanubaSdkManager();
final _epWidget = EffectPlayerWidget(key: null);
@override
void initState() {
super.initState();
initPlatformState();
}
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlatformState() async {
await _banubaSdkManager.initialize([],
'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',
SeverityLevel.info);
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;
setState(() {});
// It is required to grant all permissions for the plugin: Camera, Micro, Storage
requestPermissions().then((granted) {
if (granted) {
debugPrint('CameraPage: Thanks! All permissions are granted!');
openCamera();
} else {
debugPrint('CameraPage: WARNING! Not all required permissions are granted!');
// Plugin cannot be used. Handle this state on your app side
SystemNavigator.pop();
}
}).onError((error, stackTrace) {
debugPrint('CameraPage: ERROR! Plugin cannot be used : $error');
// Plugin cannot be used. Handle this state on your app side
SystemNavigator.pop();
});
}
Future<void> openCamera() async {
await _banubaSdkManager.openCamera();
await _banubaSdkManager.attachWidget(_epWidget.banubaId);
await _banubaSdkManager.startPlayer();
await _banubaSdkManager.loadEffect("effects/TrollGrandma", false);
}
@override
Widget build(BuildContext context) {
return MaterialApp(home: _epWidget);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
_banubaSdkManager.startPlayer();
} else {
_banubaSdkManager.stopPlayer();
}
}
}
// This is a sample implementation of requesting permissions.
// It is expected that the user grants all permissions. This solution does not handle the case
// when the user denies access or navigating the user to Settings for granting access.
// Please implement better permissions handling in your project.
Future<bool> requestPermissions() async {
final requiredPermissions = _getPlatformPermissions();
for (var permission in requiredPermissions) {
var ps = await permission.status;
if (!ps.isGranted) {
ps = await permission.request();
if (!ps.isGranted) {
return false;
}
}
}
return true;
}
List<Permission> _getPlatformPermissions() {
if (Platform.isAndroid) {
return [Permission.camera, Permission.microphone, Permission.storage];
} else if (Platform.isIOS) {
return [Permission.camera, Permission.microphone];
} else {
throw Exception('Platform is not supported!');
}
}