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
相关产品推荐
相关产品推荐

