Scanner depuis une autre application
Les intents
| Action | Filtre dans le manifeste | Ce qui se passe | Résultat |
|---|---|---|---|
com.google.zxing.client.android.SCAN | Oui, 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.SCAN | Oui. | 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.CARD | Pas 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.