Verdetto
Français

Scanner depuis une autre application

Verdetto répond à trois intents et à un partage. Rien ici ne demande une permission, une bibliothèque ou une clé. La personne garde chaque vérification de sécurité et chaque réglage de l'application ; votre application reçoit le texte du code à l'instant où elle le confirme.

Les intents

ActionFiltre dans le manifesteCe qui se passeRésultat
com.google.zxing.client.android.SCANOui, les intents implicites fonctionnent.Ouvre le scanner. Le premier code que la personne verrouille est renvoyé, comme le faisait le ZXing Barcode Scanner.RESULT_OK avec SCAN_RESULT et SCAN_RESULT_FORMAT
app.scanner.action.SCANOui.Ouvre le scanner. Lancé pour un résultat (un result launcher ou startActivityForResult), il renvoie le code de la même façon ; lancé simplement, il ouvre juste l'application sur le scanner.RESULT_OK avec les deux extras quand il est lancé pour un résultat
app.scanner.action.CARDPas de filtre : un intent explicite avec le paquet com.verdettoqr.scanner seulement.Ouvre l'éditeur de la carte de contact de la personne, le code qu'elle montre pour partager ses coordonnées. Prévu pour les widgets et raccourcis de l'application elle-même ; une autre application peut l'appeler, mais rien ne revient.Aucun
android.intent.action.SEND avec image/*Oui.Décode une image : l'application affiche la feuille de résultat pour les codes qu'elle contient.Aucun

La personne peut désactiver le renvoi dans les Réglages, sous « Transmettre les résultats à d'autres applications » (« Quand une application demande un scan, le code lui est renvoyé »), activé par défaut. Désactivé, chacune des deux actions de scan ouvre le scanner comme un lancement normal et votre launcher reçoit RESULT_CANCELED quand la personne quitte. Le retour depuis le scanner donne aussi RESULT_CANCELED.

Aucun extra de requête n'est lu aujourd'hui : ni SCAN_MODE, SCAN_FORMATS, PROMPT_MESSAGE, SAVE_HISTORY, ni aucun autre. Le scanner lit toutes les symbologies qu'il connaît à chaque appel. Un code signalé par les vérifications de l'application est quand même renvoyé ; la personne voit d'abord l'alerte et décide.

Le résultat

  • SCAN_RESULT (String) : le contenu du code, exactement les octets qu'il portait, décodés en texte (UTF-8 quand la symbologie le permet, sinon le jeu de caractères propre à la symbologie).
  • SCAN_RESULT_FORMAT (String) : la symbologie en majuscules avec des tirets bas, avec les noms ZXing quand ils existent. Livrés aujourd'hui : QR_CODE, MICRO_QR_CODE, RMQR_CODE, DATA_MATRIX, AZTEC, PDF417, MAXICODE, HAN_XIN, EAN_13, EAN_8, UPC_A, UPC_E, CODE_128, CODE_39, CODE_93, CODABAR, ITF, DATABAR, DATABAR_EXPANDED, DATABAR_LIMITED, DX_FILM_EDGE, et les autres symbologies qu'ajoutent les décodeurs propres à l'application, dans la même graphie (le nom affiché sur la feuille de résultat, en majuscules, espaces et traits d'union en tirets bas).

Rien d'autre ne voyage : ni image, ni position, ni historique.

Kotlin

private val scan = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val text = result.data?.getStringExtra("SCAN_RESULT")
        val format = result.data?.getStringExtra("SCAN_RESULT_FORMAT")
        // use text and format
    }
}

fun startScan() {
    val intent = Intent("app.scanner.action.SCAN")
    if (intent.resolveActivity(packageManager) != null) scan.launch(intent)
    else startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(GET_VERDETTO)))
}

// the store page, with the developers referrer
private const val GET_VERDETTO =
    "https://play.google.com/store/apps/details?id=com.verdettoqr.scanner&referrer=utm_source%3Ddevelopers%26utm_medium%3Ddocs%26utm_campaign%3Ddevelopers"

Sur Android 11 et suivants, ajoutez la requête à votre manifeste pour que resolveActivity puisse voir l'application :

<queries>
    <intent>
        <action android:name="app.scanner.action.SCAN" />
    </intent>
</queries>

Java

private final ActivityResultLauncher<Intent> scan = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(), result -> {
            if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
                String text = result.getData().getStringExtra("SCAN_RESULT");
                String format = result.getData().getStringExtra("SCAN_RESULT_FORMAT");
                // use text and format
            }
        });

void startScan() {
    Intent intent = new Intent("app.scanner.action.SCAN");
    if (intent.resolveActivity(getPackageManager()) != null) scan.launch(intent);
    else startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(GET_VERDETTO)));
}

L'action ZXing

Le code écrit pour le ZXing Barcode Scanner continue de fonctionner : envoyez com.google.zxing.client.android.SCAN de la même façon et lisez les deux mêmes extras. Si plusieurs scanners du téléphone y répondent, le système demande à la personne lequel utiliser ; envoyer l'intent au paquet com.verdettoqr.scanner évite cette étape.

Ce que voit la personne

Le scanner s'ouvre comme toujours, avec ses propres vérifications. Quand un code se verrouille, l'application le renvoie et se ferme ; rien de vous n'apparaît à l'écran, et rien d'elle (historique, réglages, liste de sécurité) n'est touché par l'appel.

Tester sur un téléphone sans l'application. La page du magasin avec le référent développeurs, la même adresse que le repli des exemples ouvre : Disponible sur Google Play. La source de cette page est le fichier INTENT.md de l'application ; quand les deux divergent, le dépôt de l'application a raison et cette page est en retard.