android - Android 检测到不成功的电话并稍后再试
问题描述
有没有办法在一段时间后重试错过或不成功的呼出电话?我正在使用ACTION_CALL
意图发起电话并将其连接到 PhoneStateListener。
class PlaceCall : AppCompatActivity() {
private fun outboundCall() {
val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
telephonyManager.listen(CallListener(context), PhoneStateListener.LISTEN_CALL_STATE)
val callIntent = Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber))
startActivity(callIntent)
}
}
CallListener 设置如下:
class CallListener(cont: Context) : PhoneStateListener() {
private var context: Context = cont
private var incoming: Boolean = false
private var prevState: Int = TelephonyManager.CALL_STATE_IDLE
override fun onCallStateChanged(state: Int, phoneNumber: String?) {
val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
when(state) {
TelephonyManager.CALL_STATE_RINGING -> { incoming = true }
TelephonyManager.CALL_STATE_IDLE -> {
if(prevState == TelephonyManager.CALL_STATE_RINGING) { //Missed call?
}
TelephonyManager.CALL_STATE_OFFHOOK -> { Log.d("DEBUG", "calling $phoneNumber") }
}
}
prevState = state
}
}
如果不是成功的电话呼叫连接,我如何等待确定的时间间隔并再次尝试呼叫?另外,为什么phoneNumber
监听器中的值总是空的?
解决方案
与通过IDLE
-> RINGING
->的来电不同,在出站呼叫中,它总是直接从->OFFHOOK
跳转,即使它正在响铃(在另一边)。IDLE
OFFHOOK
因此,如果“成功”您的意思是说对方接听的电话对PhoneStateListener
您没有帮助,因为对方接听时没有发送额外的状态。
另外,为什么监听器中phoneNumber的值总是空的?
phoneNumber
仅为来电填充,并且仅当您的应用同时具有READ_CALL_LOG
和READ_PHONE_STATE
权限时,请参见此处。
如果您需要最后一次呼叫号码,您可以Calls.getLastOutgoingCall
在拨出呼叫结束后几秒钟使用 API。
推荐阅读
- php - 在 woocommerce 变化的下拉菜单中显示价格
- jquery - 如何使用数据表插件按日期(从最旧到最新)排序列
- php - 使用另一个数组创建新的唯一数组
- ionic-framework - 离子存储:奇怪的行为?
- ruby-on-rails - Rails 应用模型中的 ModelName.real
- visual-studio-2015 - 在您的 SSDT 数据库项目中混合服务器数据库和本地数据库
- excel - 添加工作表后,VBA Excel 代码停止执行
- html - 是否允许在单独的影子根中使用重复的 ID?
- php - 从 WooCommerce 结帐中的自定义数据库表中获取选择字段选项
- c++ - 我想编写一个代码来分隔 C++ 中数字中各个数字的值。例如:12345 = 1+2+3+4+5