Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Kotlin으로 안드로이드 기기 일련번호(Serial Number) 확인하는 방법

이 글에서는 Kotlin을 사용해 안드로이드 기기의 일련번호(Serial Number)를 가져오는 방법을 단계별로 알아봅니다. 일련번호는 기기를 고유하게 식별하는 값으로, 기기 관리나 인증 기능을 구현할 때 유용하게 활용됩니다.

1단계: 새 프로젝트 생성

Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

2단계: 레이아웃 파일 작성 (res/layout/activity_main.xml)

아래 코드를 res/layout/activity_main.xml에 추가합니다. 화면 중앙에 버튼 하나와 결과를 표시할 TextView를 배치하는 구성입니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:text="Tutorials Point"
        android:textAlignment="center"
        android:textColor="@android:color/holo_green_dark"
        android:textSize="32sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button"
        android:layout_centerInParent="true"
        android:layout_marginTop="16sp" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:onClick="showDeviceInfo"
        android:text="Get Serial Number" />

</RelativeLayout>

3단계: 메인 액티비티 작성 (src/MainActivity.kt)

일련번호에 접근하려면 READ_PHONE_STATE 권한이 필요합니다. 아래 코드는 런타임 권한 요청부터 권한 승인 여부에 따른 처리까지 전체 흐름을 담고 있습니다.

import android.Manifest
import android.app.AlertDialog
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.telephony.TelephonyManager
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {

    private val requestState = 100
    private var checkedPermission = PackageManager.PERMISSION_DENIED
    lateinit var manager: TelephonyManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"

        checkedPermission = ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_PHONE_STATE
        )

        if (Build.VERSION.SDK_INT >= 23 && checkedPermission != PackageManager.PERMISSION_GRANTED) {
            requestPermission()
        } else {
            checkedPermission = PackageManager.PERMISSION_GRANTED
        }
    }

    private fun requestPermission() {
        Toast.makeText(this, "Requesting permission", Toast.LENGTH_SHORT).show()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            this.requestPermissions(
                arrayOf(Manifest.permission.READ_PHONE_STATE),
                requestState
            )
        }
    }

    fun showDeviceInfo(view: View) {
        manager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        val dBuilder: AlertDialog.Builder = AlertDialog.Builder(this)
        val stringBuilder = StringBuilder()

        if (checkedPermission != PackageManager.PERMISSION_DENIED) {
            dBuilder.setTitle("Device Info")
            stringBuilder.append(
                """
                SERIAL : ${Build.SERIAL}
                """.trimIndent()
            )
        } else {
            dBuilder.setTitle("Permission denied")
            stringBuilder.append("Can't access device info !")
        }

        dBuilder.setMessage(stringBuilder)
        dBuilder.show()
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        vararg permissions: String?,
        grantResults: IntArray
    ) {
        when (requestCode) {
            requestState -> if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                checkedPermission = PackageManager.PERMISSION_GRANTED
            }
        }
    }
}

주요 로직을 살펴보면 다음과 같습니다.

  • onCreate(): 앱 실행 시 READ_PHONE_STATE 권한이 부여되어 있는지 확인하고, 마시멜로(API 23) 이상에서는 권한이 없으면 런타임 권한을 요청합니다.
  • showDeviceInfo(): 버튼 클릭 시 호출되며, 권한이 있으면 Build.SERIAL 값을 다이얼로그에 표시하고, 없으면 '권한 거부' 메시지를 보여줍니다.
  • onRequestPermissionsResult(): 사용자가 권한 요청에 응답하면 그 결과를 저장합니다.

4단계: 매니페스트 설정 (androidManifest.xml)

아래와 같이 AndroidManifest.xml에 READ_PHONE_STATE 권한을 선언해야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.q11">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

앱 실행 및 결과 확인

실제 안드로이드 기기를 컴퓨터에 연결한 상태에서 앱을 실행해 보겠습니다. Android Studio에서 프로젝트의 액티비티 파일을 열고 툴바의 Run(실행) 아이콘을 클릭하세요. 목록에서 본인의 모바일 기기를 선택하면, 기기에 아래와 같은 기본 화면이 표시됩니다.

Kotlin으로 안드로이드 기기 일련번호(Serial Number) 확인하는 방법

버튼을 누르면 권한 승인 여부에 따라 기기의 일련번호가 담긴 다이얼로그가 나타납니다.

참고: 최신 안드로이드 버전에서의 주의사항

Build.SERIAL은 API 26(오레오)부터 deprecated 되었으며, API 29(안드로이드 10) 이상에서는 실제 일련번호 대신 "unknown"이 반환될 수 있습니다. 최신 기기를 지원하려면 TelephonyManager.getSerial()(API 26 이상)을 사용하는 것이 좋습니다. 이 경우에도 READ_PHONE_STATE 권한이 필요합니다.