Используйте ZXing IntentIntegrator, чтобы превратить камеру вашего телефона в мощный сканер QR-кода!

QR-коды окружают нас повсюду, и многие из нас привыкли использовать эти коды для быстрого доступа к информации. Разработчики приложений знают, что QR-коды сканируются потребителями быстро и легко. Давайте посмотрим, как мы можем реализовать сканер QR-кода в Android Studio за несколько коротких шагов.

1. Создайте новый проект Android Studio.

Откройте Android Studio и создайте новый проект. Выберите шаблон «Пустая активность». Затем назовите проект «QRScannerTest» и выберите Kotlin в качестве языка программирования. Выберите Android 7.0 для минимального SDK и создайте проект.

2. Добавьте зависимость Gradle и разрешение манифеста

Чтобы получить доступ к классу, который нам понадобится из ZXing, мы должны добавить следующую зависимость в наш файл build.gradle модуля.

implementation 'com.journeyapps:zxing-android-embedded:4.2.0'

Затем добавьте следующее разрешение в файл AndroidMainifest.xml, чтобы получить доступ к камере.

<uses-permission android:name="android.permission.CAMERA"
    />

3. Настройте макет в MainActivity.xml

Для этого проекта мы просто будем использовать ConstraintLayout с TextView и ImageButton. TextView будет ограничен в центре нашего макета и будет иметь текст «Нажмите ниже для сканирования». Наш ImageButton будет ограничен между нижней частью нашего TextView и нижней частью нашего макета. Мы выбрали векторный ресурс QR-кода из картинки Android Studio для использования с нашей кнопкой ImageButton.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Tap below to scan"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageButton
        android:id="@+id/qr_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="55dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        app:srcCompat="@drawable/qr_scanner" />

</androidx.constraintlayout.widget.ConstraintLayout>

4. Настройте код Kotlin в MainActivity.kt

Чтобы наше приложение могло сканировать QR-коды, мы должны использовать IntentIntegrator от ZXing и переопределить функцию onActivityResult в нашем классе MainActivity. IntentIntegrator позволяет нам запустить сканирование QR-кода всего несколькими строками кода. Затем результат появится в функции onActivityResult нашей Activity. Оттуда мы будем использовать AlertDialog для отправки пользователя на веб-сайт QR-кода.

4.1 Запуск сканера QR-кода в onCreate

Во-первых, мы получим ссылки на представления в нашем макете. Далее мы добавим OnclickListener в наш ImageButton, который будет использовать экземпляр IntentIntegrator для запуска сканирования.

class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val textView:TextView = findViewById(R.id.textView)
        val qrButton:ImageButton = findViewById(R.id.qr_button)
        qrButton.setOnClickListener({
            val intentIntegrator = IntentIntegrator(this)
            intentIntegrator.setDesiredBarcodeFormats(listOf(IntentIntegrator.QR_CODE))
            intentIntegrator.initiateScan()
        })

    }
}

Обратите внимание, что мы вызвали функцию setDesiredBarcodeFormats для переменной намеренияIntegrator. Эта функция позволяет нам сузить формат штрих-кода, чтобы сосредоточиться только на QR-кодах. Класс ZXing IntentIntegrator поддерживает несколько форматов штрих-кодов, но в этом руководстве мы сосредоточимся только на QR-кодах. Поэтому мы передаем список только с константой IntentIntegrator.QR_CODE в качестве единственной записи. Наконец, мы начинаем сканирование с помощью функции InitialScan переменной намеренияIntegrator.

4.2 Обработка результата сканера в onActivityResult

Результат нашего сканирования будет отправлен в функцию onActivityResult. Чтобы функция заработала, нам нужно будет вызвать функцию super.onActivityResult. После этого мы создадим переменную с именем «result», в которой будут храниться данные из функции parseActivityResult IntentIntegrator. Затем мы будем использовать условный оператор, чтобы проверить, является ли результат нашего сканирования пустым.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    var result = IntentIntegrator.parseActivityResult(resultCode, data)
    if (result != null) {
    }
}

Внутри нашего оператора if мы добавим код, который будет выполняться в случае успешного сканирования. Здесь мы создадим и отобразим AlertDialog, о котором мы упоминали ранее. Он будет иметь как положительные, так и отрицательные кнопки. Если выбрана положительная кнопка, то Intent будет использоваться для начала поиска в Интернете с данными QR-кода. В противном случае пользователь останется на том же экране в нашем приложении.

AlertDialog.Builder(this)
    .setMessage("Would you like to go to ${result.contents}?")
    .setPositiveButton("Yes", DialogInterface.OnClickListener { dialogInterface, i ->
        val intent = Intent(Intent.ACTION_WEB_SEARCH)
        intent.putExtra(SearchManager.QUERY,result.contents)
        startActivity(intent)
    })
    .setNegativeButton("No",DialogInterface.OnClickListener { dialogInterface, i ->  })
    .create()
    .show()

5. Установите и протестируйте

Чтобы протестировать это приложение, запустите его в Android Studio и установите на устройство. После установки приложения убедитесь, что вы включили разрешение камеры для приложения в настройках, если оно еще не включено. Затем найдите QR-код и нажмите кнопку ImageButton, чтобы отсканировать его. Затем вы должны увидеть экран AlertDialog с сообщением о QR-коде. Выберите «Да», если вы хотите посетить URL-адрес кода. Затем вы успешно доберетесь до пункта назначения QR-кода.

Хорошая работа! С помощью этого примера вы теперь можете создать сканер QR-кода в своем следующем проекте Android Studio! Я рекомендую вам просмотреть официальную документацию для сканера ZXing, потому что он очень универсален. Ссылка на эту документацию ниже. Кроме того, если вы хотите увидеть полный код этого проекта, не стесняйтесь щелкнуть ссылку на его репозиторий GitHub. Удачного кодирования!

Документация по сканеру штрих-кода ZXing

Гитхаб-репозиторий