Android ContentObserver Иногда не может найти запись журнала вызовов после окончания вызовов (5-10% частота отказов)
Я использую ContentObserver для мониторинга изменений журнала вызовов и получения продолжительности вызова сразу после окончания вызова. Тем не менее, 5-10% случаев, наблюдатель запускает, но не может найти соответствующую запись журнала вызовов, что приводит к «no_matching_call_log». PrettyPrint-Override ">class ReadCallStatusReceiver : BroadcastReceiver() {
private var callEndTime: Long = 0L
private var callStartTime: Long = 0L
private var callNumber: String? = null
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
TelephonyManager.ACTION_PHONE_STATE_CHANGED -> {
val state = intent.getStringExtra(TelephonyManager.EXTRA_STATE)
when (state) {
TelephonyManager.EXTRA_STATE_OFFHOOK -> {
callStartTime = System.currentTimeMillis()
// Store call number logic here
}
TelephonyManager.EXTRA_STATE_IDLE -> {
callEndTime = System.currentTimeMillis()
registerCallLogObserver(context, callNumber, callStartTime, CallLog.Calls.OUTGOING_TYPE)
}
}
}
}
}
private fun registerCallLogObserver(context: Context, phoneNumber: String?, callStartTime: Long, callType: Int) {
if (context.isPermissionGranted(Manifest.permission.READ_CALL_LOG)) {
val handler = Handler(Looper.getMainLooper())
val observer = CallLogObserver(handler, context, phoneNumber, callStartTime, callType)
context.contentResolver.registerContentObserver(CallLog.Calls.CONTENT_URI, true, observer)
}
}
}
< /code>
реализация ContentObserver: < /p>
inner class CallLogObserver(
handler: Handler,
private val context: Context,
private val phoneNumber: String?,
private val callStartTime: Long,
private val callType: Int
) : ContentObserver(handler) {
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
val delay = System.currentTimeMillis() - callEndTime
Log.d("CallLog", "Observer triggered with delay: ${delay}ms")
queryCallLog()
context.contentResolver.unregisterContentObserver(this)
}
private fun queryCallLog() {
val timeWindow = 5 * 60 * 1000 // 5 minutes
val minTime = callStartTime - timeWindow
val maxTime = callStartTime + timeWindow
val selection = "${CallLog.Calls.DATE} BETWEEN ? AND ? AND ${CallLog.Calls.TYPE}=?"
val selectionArgs = arrayOf(minTime.toString(), maxTime.toString(), callType.toString())
val sortOrder = "${CallLog.Calls.DATE} DESC"
val cursor = context.contentResolver.query(
CallLog.Calls.CONTENT_URI,
arrayOf(CallLog.Calls.DURATION, CallLog.Calls.NUMBER, CallLog.Calls.DATE),
selection,
selectionArgs,
sortOrder
)
cursor?.use {
var found = false
while (it.moveToNext()) {
val duration = it.getLong(it.getColumnIndexOrThrow(CallLog.Calls.DURATION))
val logNumber = it.getString(it.getColumnIndexOrThrow(CallLog.Calls.NUMBER))
val callDate = it.getLong(it.getColumnIndexOrThrow(CallLog.Calls.DATE))
if (normalizePhoneNumber(logNumber) == normalizePhoneNumber(phoneNumber)) {
Log.d("CallLog", "Found call: duration=$duration, date=$callDate")
found = true
break
}
}
if (!found) {
Log.e("CallLog", "no_matching_call_log - Observer delay: ${System.currentTimeMillis() - callEndTime}ms")
}
}
}
}
< /code>
Проблемы, наблюдаемые < /p>
Проблема времени: ContentObserver.Onchange () вызывается, но иногда вход журнала вызовов не сразу доступен
задержка варьируется: наблюдателю диапазоны задержки с 100 мс до 2000 мс
inconsistent: Работа 90-95% времени, не удалось случайным образом < /p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> pr>. /> Существует ли условие гонки между окончанием вызовов и системой записи для вызова /> Среда < /p>
Уровни API API Android: 21-34
Протестировано на различных устройствах (Samsung, OnePlus, Pixel)
разрешения: read_call_log, Read_phone_stat>
Подробнее здесь: https://stackoverflow.com/questions/796 ... r-call-end
Android ContentObserver иногда не может найти запись журнала вызовов после окончания вызовов (5-10% частота отказов) ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение