Verdetto
日本語

他のアプリから読み取る

Verdetto は三つのインテントと一つの共有に応えます。権限もライブラリもキーも要りません。利用者はアプリのすべての安全確認と設定をそのまま保ち、あなたのアプリは利用者が確認した瞬間にコードのテキストを受け取ります。

インテント

Actionマニフェストのフィルター何が起きるか結果
com.google.zxing.client.android.SCANはい。暗黙的インテントが使えます。スキャナーを開きます。利用者が最初にロックしたコードが、ZXing Barcode Scanner と同じように返されます。RESULT_OKSCAN_RESULTSCAN_RESULT_FORMAT
app.scanner.action.SCANはい。スキャナーを開きます。結果を求めて起動した場合(result launcher または startActivityForResult)は同じ方法でコードを返し、そのまま起動した場合はアプリをスキャナー画面で開くだけです。結果を求めて起動した場合、二つのエクストラ付きの RESULT_OK
app.scanner.action.CARDフィルターなし: パッケージ com.verdettoqr.scanner を指定した明示的インテントのみ。利用者自身の連絡先カードの編集画面、つまり自分の連絡先を共有するために見せるコードを開きます。アプリ自身のウィジェットとショートカット向けで、他のアプリから呼べますが、何も返りません。なし
android.intent.action.SENDimage/*はい。画像を解読します。アプリはその中のコードについて結果シートを表示します。なし

利用者は設定の「結果を他のアプリに渡す」(「アプリからスキャンを求められたとき、コードをそのアプリに返します」)で受け渡しをオフにできます(初期状態はオン)。オフのとき、どちらのスキャン action も通常起動としてスキャナーを開き、利用者が離れるとあなたのランチャーは RESULT_CANCELED を受け取ります。スキャナーからの戻る操作も RESULT_CANCELED です。

現在、リクエストのエクストラは読みません。SCAN_MODESCAN_FORMATSPROMPT_MESSAGESAVE_HISTORY もその他も同様です。スキャナーは呼び出しごとに知っているすべてのシンボロジーを読みます。アプリの確認が警告したコードもそのまま返されます。利用者が先に警告を見て判断します。

結果

  • SCAN_RESULT(String): コードの内容。コードが運んでいたバイトそのものをテキストとして解読したもの(シンボロジーが許す場合は UTF-8、それ以外はそのシンボロジー固有の文字集合)。
  • SCAN_RESULT_FORMAT(String): シンボロジーを大文字とアンダースコアで表したもの。ZXing の名前がある場合はそれを使います。現在返すもの: 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、およびアプリ独自のデコーダーが加えるその他のシンボロジーを同じ表記で(結果シートに表示される名前を大文字にし、スペースとハイフンをアンダースコアにしたもの)。

他には何も渡りません。画像も、位置情報も、履歴も。

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"

Android 11 以降では、resolveActivity がアプリを見つけられるように、マニフェストにクエリを追加してください:

<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)));
}

ZXing の action

ZXing Barcode Scanner 向けに書かれたコードはそのまま動きます。com.google.zxing.client.android.SCAN を同じ方法で送り、同じ二つのエクストラを読んでください。端末上の複数のスキャナーがこれに応える場合、システムがどれを使うか利用者に尋ねます。パッケージ com.verdettoqr.scanner にインテントを送ればその手順は省かれます。

利用者に見えるもの

スキャナーはいつも通り、自身の確認とともに開きます。コードがロックされるとアプリはそれを返して閉じます。あなたのものは画面に何も現れず、利用者のもの(履歴、設定、安全リスト)にこの呼び出しが触れることもありません。

アプリのない端末での確認。 開発者向けリファラー付きのストアページで、サンプルのフォールバックが開くのと同じアドレスです: Google Play で手に入れよう。このページの出典はアプリ自身の INTENT.md で、両者が異なる場合はアプリのリポジトリが正しく、このページが遅れています。