# Android Library

Mluvii poskytuje library pro integraci s vaší aplikací. Minimální verze Androidu je 5.0, protože v nižších verzích není webview postaveno na Chromiu, které se samo aktualizuje a proto je zastaralé. Námi poskytnutý kód umožňuje:

* inicializace webview s widgetem s údaji vaší společnosti

```
MluviiLibrary.getMluviiWebView(Context, Název_serveru, ID_Společnosti, ID_Tenantu, Název_balíčku, jazyk);
```

* oznámení o změně stavu widgetu

```
 MluviiLibrary.setStatusOnlineCallback(() ->{});
 MluviiLibrary.setStatusBusyCallback(() ->{});
 MluviiLibrary.setStatusOfflineCallback(() ->{});
```

* otevření chatu

```
 MluviiLibrary.runChat();
```

* zavření chatu a načtení stránky s widgetem

```
MluviiLibrary.setCloseChatFunc(() ->{});
```

* přidání vlastního callbacku na otevření URL

```
MluviiLibrary.setUrlCallbackFunc(new MluviiLibrary.UrlCallback(){

            @Override
            public Void call() throws Exception{
                Log.d("MLUVII_URL_CALLBACK","Test url: "+this.url);
                return null;
            }
        });
```

* přidání odchytávání eventů pro Začátek a konec sezení

```
public static class MluviiEventCallback implements Callable<Void>{
        public String Event;
        public long SessionId;

        @Override
        public Void call() throws Exception {
            return null;
        }
    }
```

* přidání vlastních parametrů - u přidání vlastních parametrů je nutné je nejdříve nastavit v Administračním rozhraní viz [Aplikace](/pro-administratory/sprava-tenantu/nastaveni/aplikace.md)
* Pokud uživatel mobilní aplikace musí po otevření WebView vykonat nějakou akci (kliknout na tlačítko apod.), **doporučujeme přidat delay** např. 2 sekundy. Tím zajistíte **bezchybné uložení hodnot do existujících parametrů** sezení.
* zároveň je nutné přidat apostrofy (') nebo uvozovky (") kolem klíče i hodnoty
* parametry je nutné nastavit před zavoláním metody MluviiLibrary.runChat()

```
MluviiLibrary.addCustomData("param_name", "param_value");
```

**nebo**

```
MluviiLibrary.addCustomData('param_name', 'param_value');
```

* Pro správné fungování mluvii je také doporučeno povolit cookies ve WebView

```
if (android.os.Build.VERSION.SDK_INT >= 21) {   
     CookieManager.getInstance().setAcceptThirdPartyCookies(mluviiWebView, true);
} else {
     CookieManager.getInstance().setAcceptCookie(true);
}
```

* Aby bylo možné posílat soubory do chatu, je nutné přidat následující část kódu do vašeho projektu (do MainActivity.java souboru):

```java
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        {
            if (requestCode == REQUEST_SELECT_FILE)    {
                uploadMessages = MluviiLibrary.getFilePathCallbacks();

                if (uploadMessages == null)
                    return;
                if (data == null && getCameraCaptureUri() != null){
                    uploadMessages.onReceiveValue(new Uri[]{getCameraCaptureUri()});
                }
                else
                    uploadMessages.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));

                uploadMessages = null;
            }
        } else {
            uploadMessage = MluviiLibrary.getFilePathCallback();
            if (null == uploadMessage) return;
            Uri result = data == null || resultCode != MainActivity.RESULT_OK ? null : (data.getData() != null ? data.getData() : getCameraCaptureUri());
            uploadMessage.onReceiveValue(result);
            uploadMessage = null;
        }

    }
```

uploadMessages a uploadMessage jsou proměnné definované takto:

```
 public ValueCallback<Uri[]> uploadMessages;
    public ValueCallback<Uri> uploadMessage;
```

Definice velikosti souboru, který je možné vložit do sezení:

`private static int REQUEST_SELECT_FILE = 65456`

{% hint style="danger" %}
***Aby bylo možné využívat audia a videa v aplikaci, je nutné Povolit práva pro přístup ke kameře a mikrofonu.***
{% endhint %}

Jako první část je nutné přidat do manifestu

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

Druhá část je pro zařízení s verzí Androidu 6.0+, kde lze kontrolovat práva za běhu aplikace

```
 if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.CAMERA)) {
                //Can add explanation why do you need this specific permissions
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO},
                        REQUEST_CAMERA_PERMISSION);

            } else {
                // No explanation needed; request the permission
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO},
                        REQUEST_CAMERA_PERMISSION);
            }
        }
```

* Pokud chcete používat video, je potřeba ve vašem produktu povolit kameru a mikrofon

## Android Library

{% embed url="<https://github.com/mluvii/MluviiAndroidLib>" %}

### Vzorový kód

K dispozici [zde](https://github.com/Mluvii/MluviiAndroidLib/blob/master/WebviewApp/app/src/main/java/mluviipoc/mluvii/com/webviewapp/MainActivity.java).


---

# 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://docs.mluvii.com/pro-it-specialisty/mobilni-sdk/android-library.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.
