Kotlin에서 QR 코드를 표시하는 Android 앱 만들기

QR코드를 표시할 수 있으면 금전의 교환등이 간단하게 할 수 있는 무언가를 만들 수 있지 않을까?
라고 생각 최근 여러가지 찾고 있는 나날입니다.

이번에는 Android에서 QR 코드를 표시하는 앱을 만들고 싶습니다.
개발 환경은 다음과 같습니다.

OS:macOS HighSierra
AndroidStudio:v3.1.1
Android OS:Opera v8.0.0
Language:Kotlin

사양으로는 数字를 입력하고 Button를 누르면 그에 따른 QR 코드를 생성한다는 것입니다.

도서관



QR 코드를 만들기 위해 Zxing라는 라이브러리를 사용하기 때문에build.gradle 에 추가합니다.
AndroidStudio 버전에 따라 라이브러리를 호출하는 방법이 다르므로 환경에 따라 변경하십시오.

v3.0 이상 -> implementation
그 이전 -> compile

build.gradle
...
dependencies {
    ...
    implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
}

레이아웃



이번에 사용한 것은 ImageView, EditText, Button의 3 종류입니다.
자신의 취향에 배치하십시오.

activity_main.xml
   ...
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:layout_marginBottom="91dp"
        android:layout_marginEnd="44dp"
        android:layout_marginStart="5dp"
        android:layout_marginTop="60dp"
        android:text="TAP"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/editText"
        app:layout_constraintTop_toBottomOf="@+id/imageView" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginBottom="60dp"
        android:layout_marginEnd="44dp"
        android:layout_marginStart="40dp"
        android:layout_marginTop="40dp"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@mipmap/ic_launcher_round" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="200dp"
        android:layout_height="60dp"
        android:layout_marginBottom="51dp"
        android:layout_marginEnd="5dp"
        android:layout_marginStart="47dp"
        android:layout_marginTop="93dp"
        android:ems="10"
        android:inputType="number"
        android:text="100"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/imageView" />
</android.support.constraint.ConstraintLayout>

본문



MainActivity.kt
...
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val button = findViewById<Button>(R.id.button)
        val editText = findViewById<EditText>(R.id.editText)

        button.setOnClickListener(){
            generateQR(editText.getText().toString())
        }

    }

    private fun generateQR(text: String){
        val format = BarcodeFormat.QR_CODE
        val width = 1000
        val height = width

        val hint = HashMap<EncodeHintType, Any>()
        hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M)
        hint.put(EncodeHintType.MARGIN, 0)

        val barcode = BarcodeEncoder()
        val bitmap = barcode.encodeBitmap(text, format, width, height, hint)
        val imageViewQRCode = findViewById<ImageView>(R.id.imageView)
        imageViewQRCode.setImageBitmap(bitmap)
    }
}

완제품



이런 느낌의 것이 완성됩니다.


EditTextandroid:inputType를 변경하면 문자 입력에도 대응할 수 있습니다.



표시 내용을 다음과 같이 하면 NanoWallet로 읽을 수 있습니다.

MainActivity.kt
    ...
    private fun generateQR(text: String){
        ...
        val address = "wallet address"
        val value = 1000000 * text.toInt()
        val message = "message"
        val wallet_name = "wallet_name"

        var data = "{\"v\":2,\"type\":2,\"data\":{" +
                "\"addr\":\"" + address+
                "\",\"amount\":" + value.toString() +
                ",\"msg\":\""+ message +
                "\",\"name\":\"" + wallet_name + "\"}}"
        ...
        val bitmap = barcode.encodeBitmap(text, format, width, height, hint)
        ...

좋은 웹페이지 즐겨찾기