Сканирование из другого приложения
Интенты
| 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 приложения; если они расходятся, прав репозиторий приложения, а эта страница отстаёт.