# Установка и использование плагина для Flutter

Образец кода для Flutter вы можете найти [здесь](https://gitlab.com/oz-forensics/oz-mobile-flutter-plugin/-/tree/develop/example?ref_type=heads).

## **Установка и лицензирование** <a href="#installation-and-licensing" id="installation-and-licensing"></a>

Добавьте строки из блока ниже в **pubspec.yaml** проекта, где планируется использовать плагин.

Для 8.22 и новее:

<pre class="language-yaml"><code class="lang-yaml">ozsdk: ^<a data-footnote-ref href="#user-content-fn-1">8.22.0</a>
</code></pre>

До 8.21 включительно:

<pre class="language-dart"><code class="lang-dart">  ozsdk:
    git:
      url: https://gitlab.com/oz-forensics/oz-mobile-flutter-plugin.git
      ref: '<a data-footnote-ref href="#user-content-fn-1">8.8.2</a>'
</code></pre>

Поместите файл лицензии (например, *license.json* или *forensics.license*) в папку **Flutter application/assets**. В pubspec.yaml добавьте asset:

```dart
assets
  - assets/license.json // название файла лицензии должно совпадать с названием из папки assets
```

Для Android укажите путь к репозиторию Oz  в **/android/build.gradle**, раздел **allprojects → repositories**:

```dart
allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url ‘https://ozforensics.jfrog.io/artifactory/main’ } // ссылка на репозиторий
    }
}
```

Для Flutter 8.24.0 и новее или Android Gradle plugin 8.0.0 и новее добавьте строку в **android/gradle.properties**:

```dart
android.nonTransitiveRClass=false
```

Минимальная версия SDK – 21 или выше:

```yaml
defaultConfig {
  ...
  minSDKVersion 21
  ...
}
```

Для iOS в **Runner → Info → Deployment target → iOS Deployment Target** установите версию 13 или выше.

В ios/Podfile закомментируйте строку `use_frameworks!` (`#use_frameworks!`).

## **Начало работы с Flutter** <a href="#getting-started-with-flutter" id="getting-started-with-flutter"></a>

### **Инициализация SDK** <a href="#initialize-sdk" id="initialize-sdk"></a>

Для инициализации вызовите метод `init`. Название и путь к файлу лицензии должны совпадать с теми, которые вы указали в pubspec.yaml (например, *assets/license.json*).

```dart
await OZSDK.initSDK([<% название файла лицензии и путь к нему %>]);
```

### **Подключение SDK к API** <a href="#connect-sdk-to-oz-api" id="connect-sdk-to-oz-api"></a>

Для подключения используйте полученные от нас логин, пароль и адрес API сервера.

```dart
await OZSDK.setApiConnectionWithCredentials(<login>, <password>, <host>);
```

На стадии коммерческого использования вместо логина и пароля мы рекомендуем использовать токен доступа, который можно получить с помощью метода API `/api/authorize/auth`.

```dart
 await OZSDK.setApiConnectionWithToken(token, host);
```

По умолчанию логи сохраняются вместе с данными по анализам. Если вы планируете хранить логи отдельно от этих данных, настройте отдельное подключение для [телеметрии](/oz-knowledge-ru/other/faq.md#chto-takoe-telemetriya-i-zachem-ee-podklyuchat):

```dart
await OZSDK.setEventConnectionWithCredentials(<login>, <password>, <host>);
```

или

```dart
await OZSDK.setEventConnectionWithToken(<token>, <host>);
```

### **Съемка видео** <a href="#add-face-recording" id="add-face-recording"></a>

Для запуска съемки и получения результата вызовите метод `startLiveness`:

```dart
await OZSDK.startLiveness(<actions>, <use_main_camera>);
```

| **Параметр**      | **Тип**                   | **Описание**                                                              |
| ----------------- | ------------------------- | ------------------------------------------------------------------------- |
| actions           | List\<VerificationAction> | Действия на видео                                                         |
| use\_main\_camera | Boolean                   | Если установлено `True`, используется основная камера, `False` – передняя |

Обратите внимание: для версий до 8.11 включительно метод для запуска называется `executeLiveness`. Он возвращает результат съемки.

Для получения результата съемки в версии 8.12 и новее подпишитесь на `livenessResult`, как показано ниже:

```dart
class Screen extends StatefulWidget {
  static const route = 'liveness';

  const Screen({super.key});

  @override
  State<Screen> createState() => _ScreenState();
}

class _ScreenState extends State<Screen> {
  late StreamSubscription<List<Media>> _subscription;

  @override
  void initState() {
    super.initState();

    // подписка на результат liveness
    _subscription = OZSDK.livenessResult.listen(
      (List<Media> medias) {
          // содержит медиафайл liveness
      },
      onError: (Object error) {
        // обработка ошибок, чаще всего PlatformException
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    // пропущено для сокращения образца кода
  }

  void _startLiveness() async {
    // запустите экран съемки с помощью метода startLiveness
    OZSDK.startLiveness(<list of actions>);
  }

  @override
  void dispose() {
    // cancel subscription
    _subscription.cancel();
    super.dispose();
  }
}
```

### **Выполнение проверок** <a href="#run-analyses" id="run-analyses"></a>

Размещенный ниже код поможет вам запустить анализы.

Создайте объект `Analysis`:

```dart
List<Analysis> analysis = [ Analysis(Type.quality, Mode.serverBased, <media>, {}), ];
```

Запустите созданный анализ:

```dart
final analysisResult = await OZSDK.analyze(analysis, [], {});
```

Если вы хотите запустить анализ для конкретной папки, укажите ее идентификатор:

```dart
final analysisResult = await OZSDK.analyze(analysis, folderID, [], {});
```

Результат анализа запишется в массив объектов `analysisResult`.

Для анализа медиафайла, полученного не нашим SDK, используйте следующий код:

```dart
media = Media(FileTypedocumentPhoto, VerificationAction.oneShot, “photo_selfie”, null, <pat
```

Итоговый блок кода (пример):

{% tabs %}
{% tab title="Liveness" %}

```dart
// замените VerificationAction.blank, если у вас используется другой жест Livenes
final cameraMedia = await OZSDK.executeLiveness([VerificationAction.blank], use_main_camera);

final analysis = [
  Analysis(Type.quality, Mode.serverBased, cameraMedia, {}),
];

final analysisResult = await OZSDK.analyze(analysis, [], {});
```

{% endtab %}

{% tab title="Biometry" %}

```dart
// замените VerificationAction.blank, если у вас используется другой жест Liveness
final cameraMedia = await OZSDK.executeLiveness([VerificationAction.blank], use_main_camera);
final biometryMedia = [...cameraMedia];
biometryMedia.add(
  Media(
    FileType.documentPhoto,
    VerificationAction.blank,
    MediaType.movement,
    null,
    <путь к референсному фото>,
    null,
    null,
    MediaTag.photoSelfie,
  ),
);

final analysis = [
  Analysis(Type.quality, Mode.serverBased, cameraMedia, {}),
  Analysis(Type.biometry, Mode.serverBased, biometryMedia, {}),
];

final analysisResult = await OZSDK.analyze(analysis, [], {});

```

{% endtab %}
{% endtabs %}

[^1]: Номер версии


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/oz-mobile-sdk/flutter/ustanovka-i-ispolzovanie-plagina-dlya-flutter.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
