Verdetto
Русский

Сканирование из другого приложения

Verdetto отвечает на три интента и одно действие «Поделиться». Ничему из этого не нужны разрешение, библиотека или ключ. Человек сохраняет все проверки безопасности и все настройки приложения; ваше приложение получает текст кода в момент, когда он его подтверждает.

Интенты

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/*Да.Декодирует изображение: приложение показывает лист результата для кодов в нём.Нет

Человек может отключить возврат в Настройках, пункт «Передавать результаты другим приложениям» («Когда приложение запрашивает сканирование, код возвращается ему»), включённый по умолчанию. Если он выключен, любое из двух действий сканирования открывает сканер как обычный запуск, и ваш launcher получает 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

Код, написанный для ZXing Barcode Scanner, продолжает работать: отправьте com.google.zxing.client.android.SCAN тем же способом и читайте те же два экстра. Если на телефоне на него отвечают несколько сканеров, система спрашивает человека, какой использовать; отправка интента пакету com.verdettoqr.scanner пропускает это.

Что видит человек

Сканер открывается как всегда, со своими проверками. Когда код фиксируется, приложение возвращает его и закрывается; ничего вашего на экране не появляется, и ничего его (история, настройки, список безопасности) вызов не затрагивает.

Проверка на телефоне без приложения. Страница магазина с реферером для разработчиков, тот же адрес, который открывает запасной вариант в примерах: Скачать в Google Play. Источник этой страницы — собственный INTENT.md приложения; если они расходятся, прав репозиторий приложения, а эта страница отстаёт.