他のアプリから読み取る
インテント
| Action | マニフェストのフィルター | 何が起きるか | 結果 |
|---|---|---|---|
com.google.zxing.client.android.SCAN | はい。暗黙的インテントが使えます。 | スキャナーを開きます。利用者が最初にロックしたコードが、ZXing Barcode Scanner と同じように返されます。 | RESULT_OK と SCAN_RESULT、SCAN_RESULT_FORMAT |
app.scanner.action.SCAN | はい。 | スキャナーを開きます。結果を求めて起動した場合(result launcher または startActivityForResult)は同じ方法でコードを返し、そのまま起動した場合はアプリをスキャナー画面で開くだけです。 | 結果を求めて起動した場合、二つのエクストラ付きの RESULT_OK |
app.scanner.action.CARD | フィルターなし: パッケージ com.verdettoqr.scanner を指定した明示的インテントのみ。 | 利用者自身の連絡先カードの編集画面、つまり自分の連絡先を共有するために見せるコードを開きます。アプリ自身のウィジェットとショートカット向けで、他のアプリから呼べますが、何も返りません。 | なし |
android.intent.action.SEND と image/* | はい。 | 画像を解読します。アプリはその中のコードについて結果シートを表示します。 | なし |
利用者は設定の「結果を他のアプリに渡す」(「アプリからスキャンを求められたとき、コードをそのアプリに返します」)で受け渡しをオフにできます(初期状態はオン)。オフのとき、どちらのスキャン action も通常起動としてスキャナーを開き、利用者が離れるとあなたのランチャーは RESULT_CANCELED を受け取ります。スキャナーからの戻る操作も RESULT_CANCELED です。
現在、リクエストのエクストラは読みません。SCAN_MODE、SCAN_FORMATS、PROMPT_MESSAGE、SAVE_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 で、両者が異なる場合はアプリのリポジトリが正しく、このページが遅れています。