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
};
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
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
Paramétrage du User-Agent
String userAgent = webSettings.getUserAgentString();
webSettings.setUserAgentString(userAgent + " WebViewApp/1.0");
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;
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");
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);
}
}
});
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;
}
}
}
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));
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);
}
