Verdetto
Deutsch

Scannen aus einer anderen App

Verdetto beantwortet drei Intents und ein Teilen. Nichts davon braucht eine Berechtigung, eine Bibliothek oder einen Schlüssel. Die Person behält jede Sicherheitsprüfung und jede Einstellung der App; deine App erhält den Text des Codes in dem Moment, in dem sie ihn bestätigt.

Die Intents

ActionFilter im ManifestWas passiertErgebnis
com.google.zxing.client.android.SCANJa, 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.SCANJa.Ö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.CARDKein 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.