Medicalcul peut être appelé par une application externe afin de récupérer le score au format PDF pour l'intégrer dans un dossier médical. L'application récupère un URI pointant sur le fichier PDF généré. Il est aussi possible de récupérer le nom du score généré.
Il est également possible de transmettre à Medicalcul le nom, le prénom et la date de naissance du patient. Ces données seront imprimées dans le fichier PDF.
Pour pouvoir accéder au package de Medicalcul dans les versions récentes d'Android, il vous faut ajouter au fichier AndroidManifest.xml de votre application une autorisation d'accès. Celle-ci se présente sous la forme:
<queries> <package android:name="mss.micromega.pmignard.medicalcul" /> </queries>
Aucune autorisation particulière n'est nécessaire.
L'appel à Medicalcul doit se faire via un Intent avec comme action Intent.ACTION_GET_CONTENT
. Les paramètres nom, prénom et date de naissance son passés en Extra dans l'intent, avec les noms "LastName"
, "FirstName"
et "BirthDate"
.
Lorsque Medicalcul est ouvert avec l'action ACTION_GET_CONTENT
, il affiche une option "Enregistrer et quitter" permettant à l'utilisateur de sauvegarder le score.
La fonction de retour doit être déclarée au préalable. Le code suivant présente un exemple d'appel :
// Appel de Medicalcul en mode "Récupération fichier"
// Recherche du package et création de l'Intent
Intent intent = getPackageManager().getLaunchIntentForPackage("mss.micromega.pmignard.medicalcul");
if(intent == null) {
Toast.makeText(MainActivity.this, "Medicalcul n'est pas installé", Toast.LENGTH_SHORT).show();
return;
}
intent.setAction(Intent.ACTION_GET_CONTENT); // Drapeau permettant à Medicalcul de détecter la demande de sauvegarde
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // Obligatoire pour lancer l'application et attendre le retour
// Certains paramètres peuvent être passés: nom, prénom et date de naissance. Ils seront inscrits dans le score retourné
intent.putExtra("LastName", "BeGood"); // Nom du patient
intent.putExtra("FirstName", "Johnny"); // Prénom du patient
intent.putExtra("BirthDate", "01/01/1970"); // Date de naissance du patient
// Lancement de l'application via la méthode de retour
getMedicalculScore.launch(intent);
La fonction de retour reçoit, une fois que l'utilisateur a sélectionné "Enregistrer et quitter", un résultat RESULT_OK
. Si l'utilisateur quitte Medicalcul sans sauver le score, le résultat est RESULT_CANCELLED
. L'intent de retour contient un URI de Scheme "content" et de type mime "application/pdf". Une donnée est fournie en Extra de type String et de nom "ScoreName"
.
Le code suivant donne l'exemple d'une fonction de retour qui récupère le nom du score et l'URI du fichier PDF, puis copie le PDF dans un fichier local et enfin l'ouvre pour visualisation :
// Fonction de retour du score de Medicalcul
ActivityResultLauncher<Intent> getMedicalculScore = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == RESULT_OK) { // L'utilisateur a sélectionné un fichier et l'a sauvegardé.
Intent data = result.getData();
if (data == null) // Pas de données retournées
return;
String szScoreName = data.getStringExtra("ScoreName"); // Nom du score retourné noté dans l'Extra "ScoreName"
Uri uri = data.getData(); // URI du fichier PDF renvoyé
if (uri != null) {
// L'exemple suivant lit le fichier et le stocke dans le dossier interne de l'application, puis lance une visualisation
// Le fichier source est supprimé lors de chaque sauvegarde de score par Medicalcul
try {
InputStream in = getContentResolver().openInputStream(uri); // L'accès au fichier se fait via un InputStream
if(in == null)
return; // Erreur de lecture du fichier
// Copie du fichier dans le dossier interne de l'application
String szNewDocFileName = getFilesDir().toString() + "/Exemple Score Medicalcul - "+ szScoreName + ".pdf";
new File(szNewDocFileName).delete();
FileOutputStream out = new FileOutputStream(szNewDocFileName);
byte[] b = new byte[1024];
int len;
while ((len = in.read(b, 0, 1024)) > 0) {
out.write(b, 0, len);
}
in.close();
out.close();
// Affichage du fichier (nécessite un provider défini par un fichier xml et une définition dans le manifest)
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri ViewUri = FileProvider.getUriForFile(getApplicationContext(), "your.own.file.provider.fileprovider", new File(szNewDocFileName));
intent.setDataAndType(ViewUri, "application/pdf");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (Exception e) {
Toast.makeText(this, "Erreur de lecture du fichier", Toast.LENGTH_SHORT).show();
}
}
}
});
Pour toute question, écrire à philippe.mignard@free.fr.