You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin:如何在Fragment中使用EmergencyNumber类?

解决Android中获取紧急号码的问题

首先得明确:EmergencyNumber的构造方法是包私有,所以你没法直接用EmergencyNumber()创建实例,必须通过系统提供的TelecomManager API来获取它的实例列表。

下面是具体的实现步骤和代码:

1. 声明必要权限

在AndroidManifest.xml里添加权限:

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

注意:Android 10(API 29)及以上版本,READ_PHONE_STATE属于危险权限,需要动态申请。

2. 在Fragment中实现获取号码并拨号的逻辑

class EmergencyCallFragment : Fragment() {

    private lateinit var telecomManager: TelecomManager

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // 初始化TelecomManager
        telecomManager = requireContext().getSystemService(Context.TELECOM_SERVICE) as TelecomManager
        return inflater.inflate(R.layout.fragment_emergency_call, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 绑定按钮点击事件
        view.findViewById<Button>(R.id.btn_emergency_call).setOnClickListener {
            checkPermissionsAndProcess()
        }
    }

    private fun checkPermissionsAndProcess() {
        // 检查READ_PHONE_STATE权限
        if (ContextCompat.checkSelfPermission(
                requireContext(),
                Manifest.permission.READ_PHONE_STATE
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            requestPermissions(
                arrayOf(Manifest.permission.READ_PHONE_STATE),
                REQUEST_CODE_READ_PHONE
            )
            return
        }

        // 获取紧急号码列表
        val emergencyNumbers = telecomManager.getEmergencyNumbers()
        if (emergencyNumbers.isNotEmpty()) {
            // 可根据需求筛选,比如取第一个号码,或者按类型(警察/救护车/消防)筛选
            val targetNumber = emergencyNumbers.first().number
            dialEmergencyNumber(targetNumber)
        } else {
            Toast.makeText(requireContext(), "未获取到可用紧急号码", Toast.LENGTH_SHORT).show()
        }
    }

    private fun dialEmergencyNumber(number: String) {
        val callIntent = Intent(Intent.ACTION_CALL).apply {
            data = Uri.parse("tel:$number")
        }
        // 检查拨号权限
        if (ContextCompat.checkSelfPermission(
                requireContext(),
                Manifest.permission.CALL_PHONE
            ) == PackageManager.PERMISSION_GRANTED
        ) {
            startActivity(callIntent)
        } else {
            requestPermissions(arrayOf(Manifest.permission.CALL_PHONE), REQUEST_CODE_CALL)
        }
    }

    // 处理权限申请结果
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            REQUEST_CODE_READ_PHONE -> {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    checkPermissionsAndProcess()
                } else {
                    Toast.makeText(requireContext(), "需要权限才能获取紧急号码", Toast.LENGTH_SHORT).show()
                }
            }
            REQUEST_CODE_CALL -> {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    checkPermissionsAndProcess()
                } else {
                    Toast.makeText(requireContext(), "需要权限才能拨打电话", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

    companion object {
        private const val REQUEST_CODE_READ_PHONE = 1001
        private const val REQUEST_CODE_CALL = 1002
    }
}

补充说明

  • getEmergencyNumbers()会返回设备所在地区的所有合规紧急号码,每个EmergencyNumber对象包含号码、类型、适用地区等信息,你可以通过getEmergencyNumberType()方法筛选特定类型的号码。
  • 部分地区的紧急号码无需CALL_PHONE权限即可拨打,但为了兼容不同设备和系统版本,建议还是申请该权限。

内容的提问来源于stack exchange,提问作者Incog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:12:31