Kotlin 实战:Android 设备语言与国家地区的 5 种获取方式

Kotlin 实现获取 Android 国家/地区和语言信息

在 Android 应用中获取用户的国家/地区和语言信息有多种方法,以下是几种常见的 Kotlin 实现方式:

1. 获取设备当前语言

kotlin 复制代码
// 获取当前系统语言代码 (例如 "en", "zh")
val languageCode = Locale.getDefault().language

// 获取完整语言标签 (例如 "en-US", "zh-CN")
val languageTag = Locale.getDefault().toLanguageTag()

// 获取显示名称 (例如 "English", "中文")
val displayName = Locale.getDefault().displayName

2. 获取设备国家/地区

kotlin 复制代码
// 方法1:通过Locale获取 (可能返回空字符串)
val countryCode = Locale.getDefault().country // 例如 "US", "CN"

// 方法2:通过TelephonyManager获取 (需要权限)
fun getCountryFromTelephony(context: Context): String? {
    return if (ContextCompat.checkSelfPermission(
            context,
            Manifest.permission.READ_PHONE_STATE
        ) == PackageManager.PERMISSION_GRANTED
    ) {
        val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        telephonyManager.simCountryIso ?: telephonyManager.networkCountryIso
    } else {
        null
    }
}

// 方法3:通过Network获取 (需要权限)
fun getCountryFromNetwork(context: Context): String? {
    val locale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        context.resources.configuration.locales[0]
    } else {
        context.resources.configuration.locale
    }
    return locale.country
}

3. 获取用户首选语言列表

kotlin 复制代码
// 获取用户设置的所有语言偏好 (按优先级排序)
fun getPreferredLanguages(context: Context): List<Locale> {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        context.resources.configuration.locales.toList()
    } else {
        listOf(context.resources.configuration.locale)
    }
}

4. 使用 AndroidX 的 LocaleManager (API 33+)

kotlin 复制代码
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
fun getSystemLocales(context: Context): List<Locale> {
    val localeManager = context.getSystemService(Context.LOCALE_SERVICE) as LocaleManager
    return localeManager.systemLocales.toList()
}

5. 完整工具类示例

kotlin 复制代码
import android.content.Context
import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import android.telephony.TelephonyManager
import androidx.core.content.ContextCompat
import java.util.*

class LocaleHelper {

    companion object {
        
        // 获取当前语言代码
        fun getCurrentLanguage(): String {
            return Locale.getDefault().language
        }

        // 获取当前国家代码
        fun getCurrentCountry(): String {
            return Locale.getDefault().country
        }

        // 获取设备可能的国家代码 (尝试多种方法)
        fun getDeviceCountry(context: Context): String {
            return when {
                // 1. 首先尝试从SIM卡获取
                ContextCompat.checkSelfPermission(
                    context,
                    Manifest.permission.READ_PHONE_STATE
                ) == PackageManager.PERMISSION_GRANTED -> {
                    val tm = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                    tm.simCountryIso?.takeIf { it.isNotBlank() }
                        ?: tm.networkCountryIso?.takeIf { it.isNotBlank() }
                        ?: getCurrentCountry()
                }
                
                // 2. 尝试从网络获取
                getCurrentCountry().isNotBlank() -> getCurrentCountry()
                
                // 3. 最后使用默认值
                else -> "US"
            }.uppercase(Locale.ROOT)
        }

        // 获取用户设置的所有语言偏好
        fun getUserPreferredLocales(context: Context): List<Locale> {
            return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                context.resources.configuration.locales.toList()
            } else {
                listOf(context.resources.configuration.locale)
            }
        }

        // 检查是否使用特定语言 (如中文)
        fun isUsingChinese(): Boolean {
            return Locale.getDefault().language == "zh"
        }
    }
}

使用示例

kotlin 复制代码
// 获取当前语言和国家
val language = LocaleHelper.getCurrentLanguage() // "zh"
val country = LocaleHelper.getCurrentCountry()  // "CN"

// 获取设备国家 (更可靠的方式)
val deviceCountry = LocaleHelper.getDeviceCountry(context) // "CN"

// 检查是否使用中文
if (LocaleHelper.isUsingChinese()) {
    // 显示中文内容
}

注意事项

  1. 权限要求

    • 读取 SIM 卡信息需要 READ_PHONE_STATE 权限
    • 在 Android 10 及以上版本,可能无法获取完整的 SIM 卡信息
  2. 兼容性

    • 不同 Android 版本获取方式可能不同
    • 某些设备可能返回空值
  3. 用户偏好

    • 用户可能在系统设置中更改了语言偏好
    • 考虑提供应用内语言覆盖选项
  4. 格式化

    • 国家代码通常是大写的 ISO 3166-1 alpha-2 代码
    • 语言代码通常是小写的 ISO 639-1 代码
相关推荐
GISer_Jing18 小时前
跨平台Hybrid App开发实战指南
android·flutter·react native
新之助小锅21 小时前
java版连接汇川PLC,发送数据,读取数据,保持重新链接,适用安卓
android·java·python
2501_9160074721 小时前
iOS性能调试工具终极指南,从系统底层到多端协同的全方位优化实践(2025版)
android·ios·小程序·https·uni-app·iphone·webview
2501_915921431 天前
iOS崩溃日志深度分析与工具组合实战,从符号化到自动化诊断的完整体系
android·ios·小程序·uni-app·自动化·cocoa·iphone
执念WRD1 天前
熊海CMS v1.0代码审计实战
android·nginx·安全·web安全·网络安全·系统安全
jllllyuz1 天前
基于ThinkPHP实现动态ZIP压缩包的生成
android
百***92021 天前
【MySQL】MySQL库的操作
android·数据库·mysql
2501_916008891 天前
没有源码如何加密 IPA 实战流程与多工具组合落地指南
android·ios·小程序·https·uni-app·iphone·webview
2501_940094021 天前
PS1模拟器 DuckStation更新最新版整合 下载即玩 附PS1Bios/游戏/金手指 安卓版+电脑版
android·游戏·电脑
橙武低代码1 天前
业务流低代码平台:从理念到实战
android·低代码·ai编程