【问题标题】:Access phone number in TelephonyCallback - Android在电话回拨中访问电话号码 - Android
【发布时间】:2021-11-15 14:39:19
【问题描述】:

PhoneStateListeneronCallStateChanged将通话状态和被叫号码作为参数:

val telephonyManager =
    context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

telephonyManager.listen(
    object : PhoneStateListener() {
        override fun onCallStateChanged(state: Int, phoneNumber: String) {
            super.onCallStateChanged(state, phoneNumber)
        }
    },
    PhoneStateListener.LISTEN_CALL_STATE
)

listen()PhoneStateListener被弃用之后,建议的收听电话的方法是通过registerTelephonyCallback(),以ExecutorTelephonyCallback作为参数,问题是TelephonyCallback.CallStateListeneronCallStateChanged 只将调用状态作为参数:

telephonyManager.registerTelephonyCallback(
    context.mainExecutor,
    object : TelephonyCallback(), TelephonyCallback.CallStateListener {
        override fun onCallStateChanged(state: Int) {
            // WHERE IS PHONE NUMBER?
        }
    }
)

为了使我的应用程序正常运行,我绝对需要知道被呼叫的电话号码。
有人知道如何使用TelephonyCallback 或至少不使用已弃用的方法来获取它吗?

【问题讨论】:

  • 有关于这个话题的消息吗?我也面临同样的问题。
  • 是的,我发现了一些东西,我刚刚写了一篇关于它的帖子

标签: android deprecated telephonymanager phone-state-listener


【解决方案1】:

我使用CallScreeningService 解决了这个问题,它可从 API 24 获得,但由于 callDirection 而在 API 29 之前无法使用:

@RequiresApi(Build.VERSION_CODES.N)
class PhoneCallScreening : CallScreeningService() {
    override fun onScreenCall(callDetails: Call.Details) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            if (callDetails.callDirection == Call.Details.DIRECTION_OUTGOING) {
                val phoneNumber = callDetails.handle.schemeSpecificPart

                PreferenceManager
                    .getDefaultSharedPreferences(this)
                    .edit()
                    .putString(CALLED_PHONE_NUMBER_KEY, phoneNumber)
                    .apply()
            }
        }
    }
}

要使用此功能,您的应用必须成为呼叫筛选的默认应用:

@RequiresApi(api = Build.VERSION_CODES.Q)
public void requestRole() {
    RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
    Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_SCREENING);
    startActivityForResult(intent, PHONE_SCREENING_REQUEST_ID);
}

我不知道你是否可以访问除电话号码之外的任何其他关于通话的信息​​,我目前将电话号码保存在 SharedPreferences 中,然后在新的PhoneStateListeneronCallStateChanged 中访问它。

正如我之前所说,此解决方案仅适用于 API 29,对于较低的 API 版本,您必须使用已弃用的方式,我认为这是唯一实现此目标的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2018-03-09
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多