ShapedSdkCamera

Descrição

O ShapedSdkCamera é um componente Flutter para captura de imagens e detecção de poses corporais. Ele permite capturar imagens de um usuário enquanto valida a postura e fornece feedback baseado na posição do corpo.

Instalação

Para utilizar o ShapedSdkCamera, adicione o plugin ao seu projeto Flutter. No seu pubspec.yaml, adicione:

dependencies:
  shaped_plugin: ^0.1.6

Dentro do seu projeto no arquivo local.properties, adicione suas credenciais disponibilizadas pelo administrador para garantir que as dependências privadas sejam resolvidas corretamente:

GITHUB_USER=seu_usuario
GITHUB_TOKEN=seu_token

Outro passo é a configuração para utilizar o ShapedSdkCamera no IOS, para isso vá até seu PodFile e cole o trecho a seguir, pode ser logo após platform :ios, 'xx.x':

use_simulator = ENV["USE_SIMULATOR"] == "true"
cocoapods_source = "https://cdn.cocoapods.org/"
shaped_source = use_simulator ?
  "https://github.com/shapeddev/shaped-sdk-ios-specs-emulator.git" :
  "https://github.com/shapeddev/shaped-sdk-ios-specs.git"

source cocoapods_source
source shaped_source

Em seguida, execute:

flutter pub get

Permissões Necessárias

Para utilizar a câmera, adicione as seguintes permissões nos arquivos de configuração do seu projeto:

Android

No arquivo AndroidManifest.xml, adicione:

<uses-permission android:name="android.permission.CAMERA"/>

iOS

No arquivo Info.plist (localizado em ios/Runner/Info.plist), adicione:

<key>NSCameraUsageDescription</key>
<string>Este aplicativo precisa acessar a câmera para capturar imagens.</string>

Uso

Importação

No seu arquivo Dart, importe o pacote:

import 'package:shaped_plugin/shaped_plugin.dart';

Exemplo de Implementação

Abaixo, um exemplo de como utilizar o ShapedSdkCamera dentro de um StatefulWidget:

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:shaped_plugin/shaped_plugin.dart';

class CameraPage extends StatefulWidget {
  @override
  _CameraPageState createState() => _CameraPageState();
}

class _CameraPageState extends State<CameraPage> {
  bool _frontalValidation = true;
  List<Uint8List> _capturedImages = [];

  void _handleImages(List<Uint8List> capturedImages, bool frontalValidation) {
    setState(() {
      _capturedImages = capturedImages;
      _frontalValidation = frontalValidation;
    });
  }

  Future<void> _changeFrontalValidation(bool frontalValidation) async {
    setState(() {
      _frontalValidation = frontalValidation;
    });
  }

  void _handleErrors(List<String> errors, int? countdown) {
    print("Erros detectados: $errors");
  }

  void _onValidateDeviceLevel(bool validLevel) {
    if (!validLevel) {
      print("Dispositivo não está nivelado corretamente.");
    }
  }

  Future<dynamic> showDialogCustom(
    String description,
    String labelButton,
    void Function() clickButton,
    bool barrierDismissible,
    bool buttonWide,
  ) async {
    return showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: Text(description),
        actions: [
          TextButton(onPressed: clickButton, child: Text(labelButton)),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Detecção Corporal")),
      body: Center(
        child: ShapedSdkCamera(
          frontalValidation: _frontalValidation,
          capturedImages: _capturedImages,
          onImagesCaptured: _handleImages,
          onChangeFrontalValidation: _changeFrontalValidation,
          onDeviceLevel: _onValidateDeviceLevel,
          onErrorsImage: _handleErrors,
          showDialog: showDialogCustom,
        ),
      ),
    );
  }
}

Parâmetros do ShapedSdkCamera

Parâmetro Tipo Descrição
frontalValidation bool Define se a validação frontal está ativada.
capturedImages List<Uint8List> Lista de imagens capturadas.
onImagesCaptured Function(List<Uint8List>, bool) Callback acionado ao capturar imagens.
onChangeFrontalValidation Future<void> Function(bool) Callback acionado quando há mudança na validação frontal.
onDeviceLevel Function(bool) Callback para informar se o dispositivo está nivelado.
onErrorsImage Function(List<String>, int?) Callback acionado ao detectar erros na captura.
showDialog Future<dynamic> Function(String, String, void Function(), bool, bool) Função para exibir diálogos personalizados.
currentLocale String? Idioma a ser usado pelo módulo nativo (ex: "pt-BR", "pt", "en-US", "en", "es-ES", "es", "pt-PT"). Te como default "pt-BR"

Configuração para utilizar o ShapedSdkCamera em ambiente de desenvolvimento mockado

Durante o desenvolvimento, é possível utilizar uma versão mockada da SDK, que simula a captura de imagens e a detecção de pose corporal sem precisar da câmera real ou de um dispositivo físico.
Esse modo é ideal para testes em simuladores iOS e para desenvolvimento de interface sem dependência do hardware.

O comportamento é controlado pela variável de ambiente USE_SIMULATOR.

🍎 iOS

No arquivo ios/Podfile, adicione o seguinte trecho logo após platform :ios, 'xx.x':

use_simulator = ENV["USE_SIMULATOR"] == "true"
cocoapods_source = "https://cdn.cocoapods.org/"
shaped_source = use_simulator ?
  "https://github.com/shapeddev/shaped-sdk-ios-specs-emulator.git" :
  "https://github.com/shapeddev/shaped-sdk-ios-specs.git"

source cocoapods_source
source shaped_source

Em seguida, execute um dos comandos abaixo:

# ✅ Para modo mockado (simulador)
USE_SIMULATOR=true cd ios && pod install

# 🚀 Para modo real (produção)
unset USE_SIMULATOR && cd ios && pod install

🤖 Android

No Android, a variável USE_SIMULATOR também pode ser usada para indicar o ambiente.
Ela pode ser definida em qualquer um dos seguintes locais:

  • Nas variáveis de ambiente do Flutter:

    USE_SIMULATOR=true flutter run
    
  • Ou no arquivo android/local.properties:

    USE_SIMULATOR=true
    

Considerações Finais

O ShapedSdkCamera fornece uma interface robusta para captura e validação de imagens corporais, podendo ser facilmente integrado a qualquer projeto Flutter. Certifique-se de conceder as permissões necessárias para a câmera antes de usá-lo.

Libraries

shaped_plugin