Android ClipboardManager 클립보드 복사하여 붙여넣기 + 계좌번호 감지 이체 처리

✨ 개요

Android에서는 ClipboardManager를 통해 사용자가 복사한 텍스트를 감지하고 앱 내부에서 활용할 수 있습니다.

특히 다른 앱에서 복사한 계좌번호, 인증번호, 쿠폰 코드와 같은 텍스트를 감지해 사용자에게 스낵바 안내나 즉시 실행 버튼을 제공하는 방식은 실무에서 매우 유용하게 쓰입니다.

이 글에서는 클립보드 텍스트를 감지하고 조건에 따라 동작하는 방법을 실전 예제와 함께 소개합니다.


1. ✅ 주요 기능


2. ✅ 클립보드 처리 코드 예제

2.1 계좌번호 감지 및 Snackbar 예제

import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.snackbar.Snackbar
import com.js.sample.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

  private lateinit var binding: ActivityMainBinding
  private val TAG: String = "MainActivity"

  // 📌 클립보드 매니저를 lazy 로딩
  private val clipboard by lazy {
    getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
  }

  // 📌 클립보드 접근은 앱이 포커스를 얻었을 때 시도 (Android 10+ 보안 정책 대응)
  override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if (hasFocus) {
      val clip = clipboard.primaryClip
      if (clip != null && clip.itemCount > 0) {
        val text = clip.getItemAt(0).coerceToText(this)?.toString() ?: ""
        Log.e(TAG, "복사된 텍스트=$text")
        transferMoney(text) // → 계좌번호 패턴일 경우 스낵바 띄움
      }
    }
  }

  // 📌 계좌번호 패턴 정의 (숫자 2자리 이상-2자리 이상-2자리 이상)
  private val accountRegex = Regex("""\d{2,}-\d{2,}-\d{2,}""")

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    // 📌 복사 버튼 클릭 시 입력값을 클립보드에 저장
    binding.copyButton.setOnClickListener {
      val text = binding.accountNumberEditText.text.toString() ?: ""
      if (text.isEmpty()) return@setOnClickListener
      copyToClipboard(this, "label", text)
    }
  }

  // 📌 복사된 텍스트가 계좌번호 형태일 경우 UI로 표시하고 스낵바 띄움
  private fun transferMoney(text: String) {
    binding.clipboardResultTextView.text = text

    if (accountRegex.matches(text)) {
      Snackbar.make(binding.root, "이체 페이지로 이동하시겠습니까?", Snackbar.LENGTH_LONG)
        .setAction("이체하기") {
          Toast.makeText(
            applicationContext,
            "이체 페이지로 이동합니다 계좌번호=$text",
            Toast.LENGTH_SHORT
          ).show()
        }
        .show()
    }
  }

  // 📌 클립보드에 텍스트를 저장하는 함수
  private fun copyToClipboard(context: Context, label: String, text: String) {
    val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText(label, text)
    clipboard.setPrimaryClip(clip)
    Toast.makeText(context, "클립보드에 복사됨", Toast.LENGTH_SHORT).show()
  }
}

2.2 레이아웃 코드

<?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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/accountNumberTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="12-345678-90"
        android:textSize="24dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/copyButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="계좌번호 복사하기"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/accountNumberTextView" />

    <TextView
        android:id="@+id/clipboardResultTextView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:hint="클립보드에 있는 계좌번호가 표시 됩니다"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

3.🧠 결론 & 보안 유의사항



Related Posts