[Android, Kotlin] ClipboardManager를 사용하여 기기에서 복사된 값 붙여넣기
Android

[Android, Kotlin] ClipboardManager를 사용하여 기기에서 복사된 값 붙여넣기

문제 : 택배 조회를 위해 운송장 번호를 입력해야 한다.

이 때, 휴대폰에서 복사한 운송장 번호를 자동으로 붙여넣기 할 수 있는 기능을 추가해야 한다. (Dialog를 통해 붙여넣기 여부 확인)

 

 

 

해결 : 

 

휴대폰에서 복사한 값에 대한 처리는 클립보드(clipboard)에서 담당한다.

 

클립보드(clipboard) : '종이 끼우개' 라는 뜻으로, 잘라내기(복사) / 붙여넣기를 통해 문서 또는 응용프로그램 사이에서 자료가 전송 될 때 짧은 시간동안 해당 값을 저장하는 데에 사용되는 소프트웨어 프로그램

 

우리는 이 클립보드에서 사용자가 복사 (또는 잘라내기) 한 값을 꺼내서 해당 값의 유효성을 확인 한 후, 붙여넣을지 여부를 확인 할 것이다.

 

Android, Kotlin에서는 클립보드의 값을 꺼내오기 위해 ClipboardManager를 사용한다.

 

private fun copyClipBoardInvoice() {
    //context.getSystemService를 통해 ClipboardManager를 가져온다.
    val clipboard = context?.getSystemService(Context.CLIPBOARD_SERVICE) 
    						as ClipboardManager
                            
    // clipboard 내부의 값을 가져온다.                                        
    val invoice = clipboard.plainTextClip()
    
    // 클립보드 내 값이 유효 && 운송장 번호로 사용할 숫자형태의 문자열인지 && 길이가 20자 이하인지
    if (!invoice.isNullOrBlank() && invoice.isDigitsOnly() && invoice.length <= 20) {
        AlertDialog.Builder(requireActivity())
            .setTitle("클립 보드에 있는 $invoice 를 운송장 번호로 추가하기")
            .setPositiveButton("추가") { _, _ ->
                binding.invoiceEt.setText(invoice)
            }
            .setNegativeButton("취소") { _, _ -> }
            .create()
            .show()
    }
}

// 클립보드 내 값의 유효성 검사
private fun ClipboardManager.plainTextClip(): String? =
		// 클립보드 내의 값 저장 여부 & 해당 값이 text 형식인지 판단
        if (hasPrimaryClip() && (primaryClipDescription?.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN) == true)) {
        	// 클립보드의 text 값을 toString()을 통해 String 형태로 변환하여 return 한다.
            primaryClip?.getItemAt(0)?.text?.toString()
        } else {
            // 클립보드 내 값이 없거나, text 형식이 아닐 시 null return
            null
        }

 

context.getSystemService(Context.CLIPBOARD_SERVICE) 를 통해 object를 가져오고, 이를 ClipboardManager로 타입캐스팅한다.

 

해당 ClipboardManager의 hasPrimaryClip() 통해 클립보드 내 값이 저장되어 있는지 판단한다. 또한, primaryClipDescription이 MIMETYPE_TEXT_PLAIN인지 확인하여 text 형태인지를 판단한다.

 

이러한 유효성 검사가 확인되면 클립보드 내 값을 return 하고, 확인되지 않았다면 null을 return 한다.

 

그 후 클립보드 내 값이 유효한지(nullOrBlank), 운송장 번호로 사용할 숫자형태의 문자열로만 구성되어 있는지(isDigitsOnly),

길이가 20자 이하인지 (length <= 20) 를 판별하여 값을 붙여넣기에 유효한 값인지 확인한다.

 

 

결과 :