Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách lấy số serial của thiết bị Android bằng Kotlin

Giới thiệu

Hướng dẫn này trình bày cách lấy số serial (serial number) của thiết bị Android sử dụng Build.SERIAL và quyền READ_PHONE_STATE với Kotlin.

Các bước thực hiện

Bước 1: Tạo dự án mới

Tạo project: File → New Project.

Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)

<?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>

Bước 3: Xử lý logic (src/MainActivity.kt)

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 requestCode = 100
    private var checkedPermission = PackageManager.PERMISSION_DENIED
    private 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) {
            requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE), requestCode)
        }
    }

    fun showDeviceInfo(view: View) {
        manager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        val dBuilder = 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,
        permissions: Array,
        grantResults: IntArray
    ) {
        if (requestCode == this.requestCode && grantResults.isNotEmpty() 
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            checkedPermission = PackageManager.PERMISSION_GRANTED
        }
    }
}

Bước 4: Cấu hình Manifest (androidManifest.xml)

<?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>

Chạy ứng dụng

Cấp quyền READ_PHONE_STATE khi chạy lần đầu. Nhấn "Get Serial Number" để hiển thị dialog chứa serial number.

Thay đổi quan trọng theo phiên bản Android

Android Version Hành vi Build.SERIAL
Android 7.1 (API 25) và trướcTrả về serial number phần cứng thực tế
Android 8.0 - 9.0 (API 26-28)Trả về "unknown" nếu không có READ_PHONE_STATE
Android 10 (API 29)+Luôn trả về "unknown" (đã bị loại bỏ hoàn toàn)

Thay thế cho Android 10+ (API 29+)

Không thể lấy serial number phần cứng. Các định danh thay thế:

  • Android ID: Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID) - duy nhất cho mỗi user/device combo, reset khi factory reset.
  • Advertising ID: Qua Google Play Services (AdvertisingIdClient) - user có thể reset.
  • Instance ID / Firebase Installation ID: Duy nhất cho mỗi cài đặt app.
  • UUID tự sinh: Lưu trong SharedPreferences/File nội bộ.
fun getDeviceId(context: Context): String {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        // Android 10+
        Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID) ?: "unknown"
    } else {
        // Dưới Android 10
        Build.getSerial() // Cần READ_PHONE_STATE
    }
}

Lưu ý bảo mật

Không nên dùng serial/device ID cho authentication quan trọng. Hãy dùng Firebase Auth, OAuth2, hoặc hệ thống token riêng.