README.md 12.3 KB
Newer Older
Javokhir Savriev's avatar
Javokhir Savriev committed
1
2
3
4
# MyID Android SDK

## Table of contents

Javohir Savriy's avatar
Javohir Savriy committed
5
- [Changelog](CHANGELOG.md)
Javokhir Savriev's avatar
Javokhir Savriev committed
6
7
8
9
10
11
12
13
14
- [Important](#important)
- [Getting started](#getting-started)
    - [Before you begin](#11-before-you-begin)
    - [Setup MyID Android SDK](#12-setup-myid-android-sdk)
    - [Permissions](#13-permissions)
- [Usage](#usage)
    - [Methods](#11-methods)
    - [Handling callbacks](#12-handling-callbacks)
- [SDK error codes](#sdk-error-codes)
Javohir Savriy's avatar
2.1.6    
Javohir Savriy committed
15
- [UI customization](CUSTOMIZATION.md)
Javokhir Savriev's avatar
Javokhir Savriev committed
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

## Important

**Note:** When you update the version of MyID SDK in your application, check the version of the
libraries in [dependencies](#12-setup-myid-android-sdk) and update them too!

## Getting started

### 1.1 Before you begin

Install or update Android Studio to its latest version.

The SDK supports API level 21 and above

Make sure that your app meets the following requirements:

- `minSdkVersion = 21`
- `targetSdkVersion = 33`
- `android.useAndroidX = true`

``` gradle
compileOptions {
  sourceCompatibility JavaVersion.VERSION_1_8
  targetCompatibility JavaVersion.VERSION_1_8
}
```

- myid-sdk-***.aar, has been provided to you, it contains SDK public interface and implementation.
  Archive name contains ever increasing release version number.

### 1.2 Setup MyID Android SDK

Create new project in AndroidStudio. Inside mobile application folder create new folder to store SDK
libraries (For example libs) and copy MyID SDK provided libraries.

Add reference to library to module **_build.gradle_**:

``` gradle
Javokhir Savriev's avatar
Javokhir Savriev committed
54
implementation(files("libs/myid-sdk-2.1.7-release.aar"))
Javokhir Savriev's avatar
Javokhir Savriev committed
55
56
```

Javokhir Savriev's avatar
Javokhir Savriev committed
57
58
**Note:** You can get `myid-sdk-2.1.7-release.aar` file
from [here](app/libs/myid-sdk-2.1.7-release.aar)
Javokhir Savriev's avatar
Javokhir Savriev committed
59
60
61
62
63
64
65

After synchronization, You should be able to access to SDK classes from your source code.

MyID Android SDK also requires following libraries to be added:

``` gradle
dependencies {
Javokhir Savriev's avatar
Javokhir Savriev committed
66
    implementation(files("libs/myid-sdk-2.1.7-release.aar"))
Javokhir Savriev's avatar
Javokhir Savriev committed
67
68
69
70
71
72

    implementation("androidx.appcompat:appcompat:1.5.1")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1")
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.5.1")

Javohir Savriy's avatar
2.1.5    
Javohir Savriy committed
73
    def cameraVersion = "1.2.2"
Javokhir Savriev's avatar
Javokhir Savriev committed
74
75
76
77
78
79
80
    implementation("androidx.camera:camera-camera2:$cameraVersion")
    implementation("androidx.camera:camera-lifecycle:$cameraVersion")
    implementation("androidx.camera:camera-view:$cameraVersion")
    
    // Use these dependencies if your app supports Google Play Services
    implementation("com.google.android.gms:play-services-mlkit-face-detection:17.1.0")
    implementation("com.google.android.gms:play-services-mlkit-text-recognition:18.0.2")
Javohir Savriy's avatar
2.1.5    
Javohir Savriy committed
81
    implementation("com.google.android.gms:play-services-mlkit-barcode-scanning:18.2.0")
Javokhir Savriev's avatar
Javokhir Savriev committed
82
83
84
85

    // Use these dependencies if your app doesn't support Google Play Services
    implementation("com.google.mlkit:face-detection:16.1.5")
    implementation("com.google.mlkit:text-recognition:16.0.0-beta6")
Javohir Savriy's avatar
2.1.5    
Javohir Savriy committed
86
87
88
    implementation("com.google.mlkit:barcode-scanning:17.1.0")
    
    implementation("io.ktor:ktor-client-android:2.1.2")
Javokhir Savriev's avatar
Javokhir Savriev committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
}
```

### 1.3 Permissions

Add following lines to the **_AndroidManifest.xml_**:

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

## Usage

### With Activity Result API

``` kotlin
class ExampleActivity : AppCompatActivity(), MyIdResultListener {

    private val myIdClient = MyIdClient()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        startMyId()
    }

    private fun startMyId() {
Javohir Savriy's avatar
2.1.6    
Javohir Savriy committed
116
        val organizationDetails = MyIdOrganizationDetails(
Javokhir Savriev's avatar
Javokhir Savriev committed
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
            phoneNumber = "1234567",
            logo = R.drawable.image_logo
        )
        
        val myIdConfig = MyIdConfig.builder(clientId = /* Your client id */)
            .withPassportData(passportData)
            .withBirthDate(dateOfBirth)
            .withSdkHash(sdkHash)
            .withExternalId(externalId)
            .withThreshold(threshold)
            .withBuildMode(MyIdBuildMode.PRODUCTION)
            .withEntryType(MyIdEntryType.AUTH)
            .withResidency(MyIdResidentType.RESIDENT)
            .withLocale(Locale("en"))
            .withCameraShape(MyIdCameraShape.CIRCLE)
Javokhir Savriev's avatar
Javokhir Savriev committed
132
133
            .withResolution(MyIdResolution.RESOLUTION_480)
            .withImageFormat(MyIdImageFormat.PNG)
Javokhir Savriev's avatar
Javokhir Savriev committed
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
            .withOrganizationDetails(organizationDetails)
            .withPhoto(false)
            .build()

        val intent = client.createIntent(activity = this, myIdConfig = myIdConfig)
        result.launch(intent)
    }

    private val result = takeUserResult(listener = this)
}
```

### With `onActivityResult` method

``` kotlin
class ExampleActivity : AppCompatActivity(), MyIdResultListener {

    private val myIdClient = MyIdClient()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        startMyId()
    }
    
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        myIdClient.handleActivityResult(resultCode, this)
    }

    private fun startMyId() {
Javohir Savriy's avatar
2.1.6    
Javohir Savriy committed
164
        val organizationDetails = MyIdOrganizationDetails(
Javokhir Savriev's avatar
Javokhir Savriev committed
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
            phoneNumber = "1234567",
            logo = R.drawable.image_logo
        )
        
        val myIdConfig = MyIdConfig.builder(clientId = /* Your client id */)
            .withPassportData(passportData)
            .withBirthDate(dateOfBirth)
            .withSdkHash(sdkHash)
            .withExternalId(externalId)
            .withThreshold(threshold)
            .withBuildMode(MyIdBuildMode.PRODUCTION)
            .withEntryType(MyIdEntryType.AUTH)
            .withResidency(MyIdResidentType.RESIDENT)
            .withLocale(Locale("en"))
            .withCameraShape(MyIdCameraShape.CIRCLE)
Javokhir Savriev's avatar
Javokhir Savriev committed
180
181
            .withResolution(MyIdResolution.RESOLUTION_480)
            .withImageFormat(MyIdImageFormat.PNG)
Javokhir Savriev's avatar
Javokhir Savriev committed
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
            .withOrganizationDetails(organizationDetails)
            .withPhoto(false)
            .build()

        /*
           Start the flow. 1 should be your request code (customize as needed).
           Must be an Activity or Fragment (support library).
           This request code will be important for you on onActivityResult() to identify the MyIdResultListener.
        */
        myIdClient.startActivityForResult(this, 1, myIdConfig)
    }
}
```

### 1.1 Methods

Method | Notes | Default
--- | --- | ---
`withPassportData(value: String)` | Passport serial number or PINFL data | Optional
`withBirthDate(value: String)` | Date of birth in. Format: `dd.MM.yyyy` | Optional
`withSdkHash(value: String)` | 32 characters long string | Optional
`withExternalId(value: String)` | 36 characters long. Should match with UUID4 regex | Optional
`withThreshold(value: Float)` | The value can be in the range of `0.50` - `0.99` | 0.50
`withBuildMode(value: MyIdBuildMode)` | Build mode | MyIdBuildMode.PRODUCTION
`withEntryType(value: MyIdEntryType)` | Customizing the SDK Entry types | MyIdEntryType.AUTH
`withResidency(value: MyIdResidentType)` | To set a specific resident type | MyIdResidentType.RESIDENT
`withLocale(value: Locale)` | To set a specific locale | Locale("uz")
`withCameraShape(value: MyIdCameraShape)` | To set a specific camera shape | MyIdCameraShape.CIRCLE
Javokhir Savriev's avatar
Javokhir Savriev committed
210
211
`withResolution(value: MyIdResolution)` | To set a specific camera resolution | MyIdResolution.480
`withImageFormat(value: MyIdImageFormat)` | To set a specific image format | MyIdImageFormat.PNG
Javohir Savriy's avatar
2.1.6    
Javohir Savriy committed
212
`withOrganizationDetails(value: MyIdOrganizationDetails)` | Custom Organization Details | Optional
Javokhir Savriev's avatar
Javokhir Savriev committed
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
`withPhoto(value: Boolean)` | Return SDK face bitmap | false

**Note 1.1.** You can customize the screen for entering passport data and date of birth in your
application, in which case you can pass these parameters during initialization to the SDK, otherwise
the SDK requires the input of passport data and date of birth for user identification.

**Note 1.2.** If the `sdk_hash` is empty, blank or string with length other than 32 has been
provided, we will continue showing the credentials screen.

**Note 1.3.** If the `externalId` is not empty, has a length of 36 characters and corresponds to the
regular expression UUID4, we will display a [recommendation](images/screen01.jpg) screen in case the
sdk detects a blurry photo.

**Note 1.4.** `MyIdBuildMode` contains **DEBUG** and **PRODUCTION** modes.

- **DEBUG** is used to sandbox.
- **PRODUCTION** is used to production.

**Note 1.5.** `MyIdEntryType` contains **AUTH** and **FACE** types.

- **AUTH** is used to identify the user through the MyID services.
- **FACE** is used to detect a face and returns a picture (bitmap).

**Note 1.6.** `MyIdCameraShape` contains **[CIRCLE](images/screen03.jpg)**
and **[ELLIPSE](images/screen04.jpg)** types.

### 1.2 Handling callbacks

```kotlin
val myIdResultListener: MyIdResultListener = object : MyIdResultListener {
    override fun onSuccess(result: MyIdResult) {
        // Get face bitmap and result code

        val bitmap = result.bitmap
        val code = result.code
        val comparison = result.comparison
    }

    override fun onUserExited() {
        // User left the SDK
    }

    override fun onError(e: MyIdException) {
        // Get error message and code:

        val message = e.message
        val code = e.code
    }
}
```

| Attribute     |    Notes    |
| -----|-------|
| `onSuccess` | `MyIdResult` contains information about the face captures made during the flow, result code and comparison value. |
| `onUserExited` | User left the SDK flow without completing it. |
| `onError` | Some error happened. `MyIdException` contains information about the error message and code |

## SDK error codes

The error code in the following list may appear during the call of SDK. The list below is for your
reference.

| Code |      Error message
|:----:|:-------------
|  2   |  Паспортные данные введены неправильно
|  3   |  Не удалось подтвердить жизненность
|  4   |  Не удалось распознать
|  5   |  Внешний сервис недоступен или работает некорректно
|  6   |  Запрашиваемый пользовател скончался
|  7   |  Фото с ресурсов не получено
|  8   |  Внутренняя ошибка MyID
|  9   |  Срок выполнения задачи истек
|  10  |  Срок ожидания задачи в очереди истек
|  11  |  Сервис MyID не может обработать запрос. Попробуйте повторить позже
|  12  |  Сервис MyID не может обработать запрос. Попробуйте повторить позже
|  13  |  Сервис MyID не может обработать запрос. Попробуйте повторить позже
|  14  |  Не удалось подтвердить жизненность. Некорректная фотография
|  15  |  Сервис MyID не может обработать запрос. Попробуйте повторить позже
|  16  |  Сервис MyID не может обработать запрос. Попробуйте повторить позже
|  17  |  Не удалось распознать. Некорректная фотография
|  18  |  Сервис проверки жизненности не может обработать запрос
|  19  |  Сервис распознования не может обработать запрос
|  20  |  Размытая фотография
|  21  |  Лицо не полностью изображено
|  22  |  Обнаружено несколько лиц
|  23  |  Представленное изображение в градациях серого, требуется цветное изображение
|  24  |  Обнаружены затемненные очки
|  25  |  Тип фотографии не поддерживается
|  26  |  Глаза закрыты либо не видны
|  27  |  Обнаружено вращение головы
|  28  |  Не удалось обнаружить все ориентиры
| 101  |  Непредвиденная ошибка
| 102  |  Доступ к камере запрещен
| 103  |  Ошибка при получении данных с сервера
| 120  |  Размытое фото обнаружено в SDK