Scannen aus einer anderen App
Die Intents
| Action | Filter im Manifest | Was passiert | Ergebnis |
|---|---|---|---|
com.google.zxing.client.android.SCAN | Ja, implizite Intents funktionieren. | Öffnet den Scanner. Der erste Code, den die Person erfasst, wird zurückgegeben, so wie es der ZXing Barcode Scanner tat. | RESULT_OK mit SCAN_RESULT und SCAN_RESULT_FORMAT |
app.scanner.action.SCAN | Ja. | Öffnet den Scanner. Für ein Ergebnis gestartet (ein Result-Launcher oder startActivityForResult) gibt er den Code auf demselben Weg zurück; einfach gestartet öffnet er nur die App auf dem Scanner. | RESULT_OK mit den beiden Extras, wenn für ein Ergebnis gestartet |
app.scanner.action.CARD | Kein Filter: nur ein expliziter Intent mit dem Paket com.verdettoqr.scanner. | Öffnet den Editor der eigenen Kontaktkarte der Person, den Code, den sie zum Teilen ihrer Daten zeigt. Gedacht für die Widgets und Verknüpfungen der App selbst; eine andere App darf ihn aufrufen, aber es kommt nichts zurück. | Keins |
android.intent.action.SEND mit image/* | Ja. | Decodiert ein Bild: Die App zeigt das Ergebnisblatt für die Codes darin. | Keins |
Die Person kann die Rückgabe in den Einstellungen unter „Ergebnisse an andere Apps übergeben“ („Wenn eine App einen Scan anfordert, geht der Code an sie zurück“) abschalten; sie ist standardmäßig an. Ist sie aus, öffnet jede Scan-Action den Scanner wie einen normalen Start, und dein Launcher erhält RESULT_CANCELED, wenn die Person ihn verlässt. Zurück aus dem Scanner ist ebenfalls RESULT_CANCELED.
Derzeit werden keine Request-Extras gelesen: weder SCAN_MODE, SCAN_FORMATS, PROMPT_MESSAGE, SAVE_HISTORY noch andere. Der Scanner liest bei jedem Aufruf jede Symbologie, die er kennt. Ein Code, den die Prüfungen der App markieren, wird trotzdem zurückgegeben; die Person sieht zuerst die Warnung und entscheidet.
Das Ergebnis
SCAN_RESULT(String): der Inhalt des Codes, genau die Bytes, die der Code trug, als Text decodiert (UTF-8, wo die Symbologie es erlaubt, sonst der eigene Zeichensatz der Symbologie).SCAN_RESULT_FORMAT(String): die Symbologie in Großbuchstaben mit Unterstrichen, die ZXing-Namen, wo es sie gibt. Derzeit geliefert: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, und die weiteren Symbologien, die die eigenen Decoder der App hinzufügen, in derselben Schreibweise (der Name auf dem Ergebnisblatt, großgeschrieben, Leerzeichen und Bindestriche als Unterstriche).
Sonst reist nichts mit: kein Bild, kein Standort, keine Historie.
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"
Ab Android 11 nimm die Query in dein Manifest auf, damit resolveActivity die App sehen kann:
<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)));
}
Die ZXing-Action
Code, der für den ZXing Barcode Scanner geschrieben wurde, funktioniert weiter: Sende com.google.zxing.client.android.SCAN auf demselben Weg und lies dieselben zwei Extras. Antworten mehrere Scanner auf dem Telefon darauf, fragt das System die Person, welchen sie nutzen möchte; den Intent an das Paket com.verdettoqr.scanner zu senden, überspringt das.
Was die Person sieht
Der Scanner öffnet sich wie immer, mit seinen eigenen Prüfungen. Rastet ein Code ein, gibt die App ihn zurück und schließt sich; nichts von dir erscheint auf dem Bildschirm, und nichts von der Person (Historie, Einstellungen, Sicherheitsliste) wird durch den Aufruf berührt.
Testen auf einem Telefon ohne die App. Die Store-Seite mit dem Entwickler-Referrer, dieselbe Adresse, die der Fallback in den Beispielen öffnet: Bei Google Play holen. Die Quelle dieser Seite ist die INTENT.md der App selbst; weichen beide voneinander ab, hat das App-Repository recht und diese Seite hinkt hinterher.