logo
Développement
Rechercher
Guide d'intégration de l'Espace de travail Android

Guide d'intégration de l'Espace de travail Android

Introduction

Ce guide fournit des instructions détaillées sur la façon d'intégrer l'espace de travail GPTBots dans une application Android, y compris les demandes d'autorisations, l'interaction native-H5, et d'autres configurations associées.

GPTBots propose également un projet de démonstration de l'espace de travail pour vous aider à démarrer rapidement. Projet de démonstration Android : Projet de Démo Android

Liste des autorisations

Autorisations de base

Pour garantir le bon fonctionnement des fonctionnalités liées à l'espace de travail, configurez les autorisations suivantes dans AndroidManifest.xml :

Gestion des autorisations

Pour que l'application puisse accéder aux autorisations sensibles telles que le microphone, la caméra et la galerie lors de l'exécution, les autorisations nécessaires doivent être demandées au démarrage de l'application :

// Autorisations demandées pour Android 13 et supérieur private final String[] permissionsForAndroid13 = { Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_AUDIO, Manifest.permission.READ_MEDIA_VIDEO }; // Autorisations demandées pour les versions inférieures à Android 13 private final String[] permissionsForBelowAndroid13 = { Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE };
                      
                      // Autorisations demandées pour Android 13 et supérieur
private final String[] permissionsForAndroid13 = {
    Manifest.permission.RECORD_AUDIO,
    Manifest.permission.READ_MEDIA_IMAGES,
    Manifest.permission.READ_MEDIA_AUDIO,
    Manifest.permission.READ_MEDIA_VIDEO
};

// Autorisations demandées pour les versions inférieures à Android 13
private final String[] permissionsForBelowAndroid13 = {
    Manifest.permission.RECORD_AUDIO,
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.WRITE_EXTERNAL_STORAGE
};

                    
Ce bloc de code dans la fenêtre flottante

Configuration WebView

Configuration de base

L'application crée une instance WebView et effectue les réglages nécessaires :

WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // Activer JavaScript webSettings.setDomStorageEnabled(true); // Activer l'API de stockage DOM webSettings.setAllowFileAccess(true); // Autoriser l'accès aux fichiers webSettings.setAllowContentAccess(true); // Autoriser l'accès aux URL de contenu webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // Autoriser le contenu mixte webSettings.setMediaPlaybackRequiresUserGesture(false); // La lecture média ne nécessite pas de geste utilisateur
                      
                      WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true); // Activer JavaScript
webSettings.setDomStorageEnabled(true); // Activer l'API de stockage DOM
webSettings.setAllowFileAccess(true); // Autoriser l'accès aux fichiers
webSettings.setAllowContentAccess(true); // Autoriser l'accès aux URL de contenu
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // Autoriser le contenu mixte
webSettings.setMediaPlaybackRequiresUserGesture(false); // La lecture média ne nécessite pas de geste utilisateur

                    
Ce bloc de code dans la fenêtre flottante

Configuration de l'enregistrement audio

webSettings.setAllowFileAccessFromFileURLs(true); // Autoriser les URL de fichiers à accéder aux fichiers webSettings.setAllowUniversalAccessFromFileURLs(true); // Autoriser l'accès universel webSettings.setDatabaseEnabled(true); // Activer la base de données webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); // Définir le mode de cache
                      
                      webSettings.setAllowFileAccessFromFileURLs(true); // Autoriser les URL de fichiers à accéder aux fichiers
webSettings.setAllowUniversalAccessFromFileURLs(true); // Autoriser l'accès universel
webSettings.setDatabaseEnabled(true); // Activer la base de données
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); // Définir le mode de cache

                    
Ce bloc de code dans la fenêtre flottante

Paramétrage du User-Agent

String userAgent = webSettings.getUserAgentString(); webSettings.setUserAgentString(userAgent + " WebViewApp/1.0");
                      
                      String userAgent = webSettings.getUserAgentString();
webSettings.setUserAgentString(userAgent + " WebViewApp/1.0");

                    
Ce bloc de code dans la fenêtre flottante

Accès à l'Espace de travail

Construction de l'URL

L'accès à l'espace de travail nécessite les paramètres Base URL et AiToken :

String baseUrl = "https://gptbots.ai/space/h5/home"; String aiToken = "YOUR_AI_TOKEN"; // Remplacez par le véritable AiToken String fullUrl = baseUrl + "?AiToken=" + aiToken;
                      
                      String baseUrl = "https://gptbots.ai/space/h5/home";
String aiToken = "YOUR_AI_TOKEN"; // Remplacez par le véritable AiToken
String fullUrl = baseUrl + "?AiToken=" + aiToken;

                    
Ce bloc de code dans la fenêtre flottante

L'AiToken par défaut est préconfiguré dans l'application. Si vous devez le modifier, vous pouvez le saisir sur la page de connexion.

Chargement de la page

webView.loadUrl(fullUrl);

Interaction WebView et Native

Enregistrer l'interface JavaScript

webView.addJavascriptInterface(new JSBridge(), "agentWebBridge");
                      
                      webView.addJavascriptInterface(new JSBridge(), "agentWebBridge");

                    
Ce bloc de code dans la fenêtre flottante

La page H5 appelle les méthodes natives via l'objet global agentWebBridge.

Gestion des autorisations

Requêtes d'autorisations WebView

Lorsque la page H5 demande des autorisations spéciales (telles que l'enregistrement audio), il est nécessaire de gérer les requêtes d'autorisations WebView :

webView.setWebChromeClient(new WebChromeClient() { @Override public void onPermissionRequest(PermissionRequest request) { String[] requestedResources = request.getResources(); boolean hasAudioPermission = false; for (String resource : requestedResources) { if (PermissionRequest.RESOURCE_AUDIO_CAPTURE.equals(resource)) { hasAudioPermission = true; break; } } if (hasAudioPermission) { // Vérifier si l'application dispose de l'autorisation d'enregistrement audio if (checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) { request.grant(requestedResources); } else { // Demander l'autorisation système requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_CODE); // Stocker la demande d'autorisation pour traitement après obtention de l'autorisation pendingPermissionRequest = request; } } else { // Accorder directement les autres autorisations request.grant(requestedResources); } } });
                      
                      webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onPermissionRequest(PermissionRequest request) {
        String[] requestedResources = request.getResources();
        boolean hasAudioPermission = false;
        
        for (String resource : requestedResources) {
            if (PermissionRequest.RESOURCE_AUDIO_CAPTURE.equals(resource)) {
                hasAudioPermission = true;
                break;
            }
        }
        
        if (hasAudioPermission) {
            // Vérifier si l'application dispose de l'autorisation d'enregistrement audio
            if (checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
                request.grant(requestedResources);
            } else {
                // Demander l'autorisation système
                requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_CODE);
                // Stocker la demande d'autorisation pour traitement après obtention de l'autorisation
                pendingPermissionRequest = request;
            }
        } else {
            // Accorder directement les autres autorisations
            request.grant(requestedResources);
        }
    }
});

                    
Ce bloc de code dans la fenêtre flottante

Gestion de la sélection de fichiers

Gérez les opérations de sélection de fichiers depuis les pages H5 :

webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { // Sauvegarder le callback this.filePathCallback = filePathCallback; // Créer l'Intent de sélection de fichier Intent intent = fileChooserParams.createIntent(); startActivityForResult(intent, REQUEST_FILE_CHOOSER); return true; } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_FILE_CHOOSER) { if (filePathCallback != null) { Uri[] results = null; if (resultCode == RESULT_OK && data != null) { // Traiter les résultats de la sélection // ... } filePathCallback.onReceiveValue(results); filePathCallback = null; } } }
                      
                      webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        // Sauvegarder le callback
        this.filePathCallback = filePathCallback;
        
        // Créer l'Intent de sélection de fichier
        Intent intent = fileChooserParams.createIntent();
        startActivityForResult(intent, REQUEST_FILE_CHOOSER);
        return true;
    }
});

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    if (requestCode == REQUEST_FILE_CHOOSER) {
        if (filePathCallback != null) {
            Uri[] results = null;
            
            if (resultCode == RESULT_OK && data != null) {
                // Traiter les résultats de la sélection
                // ...
            }
            
            filePathCallback.onReceiveValue(results);
            filePathCallback = null;
        }
    }
}

                    
Ce bloc de code dans la fenêtre flottante

Exemples de fonctions

Fermer la WebView

La page H5 peut demander la fermeture de la WebView de la manière suivante :

var message = { eventType: "click", data: { value: "close" } }; agentWebBridge.callNative(JSON.stringify(message));
                      
                      var message = {
    eventType: "click",
    data: {
        value: "close"
    }
};
agentWebBridge.callNative(JSON.stringify(message));

                    
Ce bloc de code dans la fenêtre flottante

Traitement côté natif :

public void onClick(JSONObject data) { String value = data.optString("value"); if (TextUtils.equals(value, "close")) { closeWeb(data); } } public void closeWeb(JSONObject data) { // Notifier H5 qu'il va se fermer JSONObject willCloseData = new JSONObject(); willCloseData.put("value", data.optString("value")); willCloseData.put("reason", "user_request"); willCloseData.put("delay", 1000); willCloseData.put("timestamp", System.currentTimeMillis()); webViewBridge.callH5(WebViewBridge.EVENT_CLICK, willCloseData); // Fermer l'Activity avec un délai webView.postDelayed(() -> { finish(); }, 1000); }
                      
                      public void onClick(JSONObject data) {
    String value = data.optString("value");
    if (TextUtils.equals(value, "close")) {
        closeWeb(data);
    }
}
public void closeWeb(JSONObject data) {
    // Notifier H5 qu'il va se fermer
    JSONObject willCloseData = new JSONObject();
    willCloseData.put("value", data.optString("value"));
    willCloseData.put("reason", "user_request");
    willCloseData.put("delay", 1000);
    willCloseData.put("timestamp", System.currentTimeMillis());
    webViewBridge.callH5(WebViewBridge.EVENT_CLICK, willCloseData);
    // Fermer l'Activity avec un délai
    webView.postDelayed(() -> {
        finish();
    }, 1000);
}

                    
Ce bloc de code dans la fenêtre flottante