# Работа с контейнером данных OzCapsula в мобильных SDK

OzCapsula – это разработанный нами проприетарный формат, контейнер данных, обеспечивающий сквозную защиту и целостность информации в процессе передачи. Функциональность добавлена в версии 8.22. Для использования контейнера введены следующие методы:

* `createMediaCaptureScreen(request)` запускает съемку видео и затем пакует готовый файл в контейнер;
* `AnalysisRequest.addContainer` добавляет контейнер в запрос на анализ.

Также необходим новый токен: `session_token`. Как его получить, мы рассказываем [здесь](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/api/oz-api/rabota-s-konteinerom-dannykh-ozcapsula#poluchenie-session-token).

### Примеры кода <a href="#code-examples" id="code-examples"></a>

С примерами кода вы можете ознакомиться, пройдя по ссылкам ниже. Также ниже размещены краткие иллюстративные примеры.

* [Kotlin](https://gitlab.com/oz-forensics/oz-liveness-android/-/blob/master/sample-kotlin/src/main/java/com/ozforensics/liveness/sample/LivenessContainerActivity.kt)
* [Java](https://gitlab.com/oz-forensics/oz-liveness-android/-/blob/master/sample-java/src/main/java/com/ozforensics/liveness/sample/LivenessContainerActivity.java)
* [Swift](https://gitlab.com/oz-forensics/public/oz-liveness-ios-sample/-/blob/main/OZLiveness/DataContainerViewController.swift?ref_type=heads)

#### **Kotlin** <a href="#kotlin" id="kotlin"></a>

```kotlin
// захват и упаковка видео
val referentPhoto = MediaRequest.UserMedia(OzAbstractMedia.OzDocumentPhoto(OzMediaTag.Blank, referentPhotoPath))
val blinkVideo = MediaRequest.ActionMedia(OzAction.EyeBlink)
val scanVideo = MediaRequest.ActionMedia(OzAction.Scan)

val intent = OzLivenessSDK.createMediaCaptureScreen(
    CaptureRequest(
        listOf(
            AnalysisProfile(
                Analysis.Type.BIOMETRY,
                listOf(referentPhoto, scanVideo)
            ),
            AnalysisProfile(
                Analysis.Type.QUALITY,
                listOf(referentPhoto, scanVideo, blinkVideo)
            ),
        ),
    ),
    sessionToken
)
startActivityForResult(intent, REQUEST_CODE_SDK)

// подписка на результаты
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE_SDK) {
        when (resultCode) {
            OzLivenessResultCode.USER_CLOSED_LIVENESS -> { /* user closed the screen */ }
            OzLivenessResultCode.SUCCESS -> {
            // result
                val container = OzLivenessSDK.getContainerFromIntent(data)
                ...
            }
            else -> {
            // обработка ошибок
                val errorMessage = OzLivenessSDK.getErrorFromIntent(data)
                ...
            }
        }
    }
}

// запуск анализов
AnalysisRequest.Builder()
    .addContainer(container)
    .build()
    .run(
        object: AnalysisRequest.AnalysisListener {
            override fun onSuccess(result: RequestResult) {
                ...
            }
            override fun onError(exception: OzException) {
                ...
            }
        }
    )
```

#### **Swift** <a href="#swift" id="swift"></a>

```swift
// захват и упаковка видео
let mediaRequest = MediaRequest.actionMedia(.selfie)
let profile = AnalysisProfile(mediaList: [mediaRequest],
                           type: .quality,
                           params: ["extract_best_shot" : true])
             
let request = CaptureRequest(analysisProfileList: [profile], cameraPosition: cameraPosition)
self.ozLivenessVC = try OZSDK.createMediaCaptureScreen(self, request, sessionToken: sessionToken)
self.present(ozLivenessVC, animated: true)

// подписка на результат
extension ViewController: LivenessDelegate {
   
  func onError(status: OZVerificationStatus?) {
      // обработка ошибок
  }
 // запуск анализов  
  func onResult(container: DataContainer) {
    let analysisRequest = AnalysisRequestBuilder()
    analysisRequest.addContainer(container)
     
    analysisRequest.run(statusHandler: { [weak self] state in
     },
              errorHandler: { [weak self] error in
     // обработка ошибок
    }) { result in
// результат анализа
        }
   }
```

### Методы и поля <a href="#methods-and-properties" id="methods-and-properties"></a>

#### addContainer

Метод заменяет `addAnalysis` в структуре `AnalysisRequest` при использовании контейнера.

**Input**

|                 |              |                                                                                                                                       |
| --------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| **Параметр**    | **Тип**      | **Описание**                                                                                                                          |
| OzDataContainer | bytearray\[] | Зашифрованный файл с медиа и сопутствующей информацией, результат вызова метода [createMediaCaptureScreen](#createmediacapturescreen) |

#### createMediaCaptureScreen

Запускает съемку видео и затем пакует снятое видео и сопутствующую ему информацию в контейнер данных.

**Входные параметры**

| **Параметр**   | **Type**                                            | **Description**                   |
| -------------- | --------------------------------------------------- | --------------------------------- |
| request        | [CaptureRequest](#public-data-class-capturerequest) | Распознает запрос на съемку видео |
| session\_token | String                                              | Токен для текущей сессии          |

**Выходные параметры**

| **Параметр**    | **Type**     | **Description**                                        |
| --------------- | ------------ | ------------------------------------------------------ |
| OzDataContainer | bytearray\[] | Зашифрованный файл с медиа и сопутствующей информацией |

#### public data class CaptureRequest

Распознает запрос на съемку видео.

| **Параметр**                        | **Тип**                                                     | **Описание**                                                                                       |
| ----------------------------------- | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| analysisProfileList                 | List<[AnalysisProfile](#public-data-class-analysisprofile)> | Список объектов с информацией о медиафайлах и анализах, которые на них назначены                   |
| folderMeta (необязательно)          | Map\<String, Any>                                           | Метаданные папки                                                                                   |
| additionalMediaList (необязательно) | List<[MediaRequest](#public-sealed-class-mediarequest)>     | Дополнительные медиафайлы, которые вы хотите загрузить, но для анализа они не обязательны          |
| cameraPosition (optional)           | String                                                      | <p><code>front</code> (по умолчанию) – передняя камера</p><p><code>back</code> – задняя камера</p> |

#### public data class AnalysisProfile

Содержит информацию о медиафайлах и анализах, которые на них назначены.

| **Параметр**           | **Тип**                                                                                                                                                                                                                                                                                                                    | **Описание**                     |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
| mediaList              | List<[MediaRequest](#public-sealed-class-mediarequest)>                                                                                                                                                                                                                                                                    | Список медиа для анализа         |
| type                   | String ([Type](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/android/metody-i-polya-android-sdk#h.fr9jc6r5rcc) (Android) or [AnalysisType](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/ios/metody-i-polya-ios-sdk#h.qww0i8kvhvdr) (iOS)) | Тип анализа                      |
| params (необязательно) | Map\<String, Any>                                                                                                                                                                                                                                                                                                          | Дополнительные параметры анализа |

#### public sealed class MediaRequest

Содержит информацию о медиафайле.

{% hint style="warning" %}
Обратите внимание: параметры  `actionMedia` и `userMedia` – взаимоисключающие, структура должна содержать только один из них.
{% endhint %}

| **Параметр** | Тип                                                                                                                                                                                                                                                                                                                              | Описание                                                             |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| id           | String (UUID v4)                                                                                                                                                                                                                                                                                                                 | Идентификатор медиафайла                                             |
| actionMedia  | [OzAction](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/android/metody-i-polya-android-sdk#h.2nyke2meu4aw) (Android) or [OzVerificationMovement](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/ios/metody-i-polya-ios-sdk#h.20yp3ix24ijd) (iOS) | Действие, которое пользователь выполняет на видео                    |
| userMedia    | [OzAbstractMedia](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/android/metody-i-polya-android-sdk#h.s2ye0si7dzc2) (Android) or [OZMedia](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/ios/metody-i-polya-ios-sdk#h.hizmhq9c5cq9) (iOS)         | Файл не из нашего SDK, например, референсное фото или фото документа |

#### Список ошибок

| **Ошибка**                                                                                                                                          | **Текст**                                                     | **Описание**                                      |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------- |
| session\_token\_is\_empty                                                                                                                           | Session token must not be empty                               | Отсутствует session token – обязательный параметр |
| data\_container\_internal\_failure\_1                                                                                                               | Internal failure occurred while processing the data container | На устройстве недостаточно памяти                 |
| <ul><li>data\_container\_internal\_failure\_2</li><li>data\_container\_internal\_failure\_3</li><li>data\_container\_internal\_failure\_4</li></ul> | Internal failure occurred while processing the data container | Контейнер создать не удалось. Попробуйте еще раз  |
| data\_container\_internal\_failure\_1000                                                                                                            | Internal failure occurred while processing the data container | Любая другая ошибка не из списка выше             |

Если во время съемки возникнет ошибка, из-за которой пользователь не сможет завершить сценарий, контейнер данных будет удален.

Если у вас остались вопросы, пожалуйста, свяжитесь с нами.


---

# 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/rabota-s-konteinerom-dannykh-ozcapsula-v-mobilnykh-sdk.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.
