【问题标题】:Detecting incoming and outgoing calls in android API29+在 android API29+ 中检测来电和去电
【发布时间】:2020-10-20 12:53:00
【问题描述】:

关于在an​​droid中检测来电和去电有很多问题,但它们都是旧的,而且android也弃用了有用的功能,而且google play拒绝了我的应用程序,因为我正在使用它们。

用于检测我使用的拨出电话:

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

并且还收听android.intent.action.NEW_OUTGOING_CALL广播监听器。

根据谷歌文档(this),我们应该使用CallRedirectionServiceCallScreeningService。但这些服务适用于 API 29+。

那么有什么方法可以检测不弃用且不使用敏感权限的来电和去电?

如果有任何调用,我想关闭我的套接字连接,如果没有,我想重新打开它。

【问题讨论】:

  • 就我而言,我认为没有办法检测没有敏感权限的呼叫。我最近开发了应用程序,并通过android.permission.PROCESS_OUTGOING_CALLS 权限归档了相同的应用程序,但最后由于使用了android.permission.PROCESS_OUTGOING_CALLS 更敏感的权限,谷歌拒绝了我的应用程序。他们希望有充分的理由使用此类许可。

标签: android android-service android-permissions android-broadcast telephonymanager


【解决方案1】:

您需要 ACTION_PHONE_STATE_CHANGED 的 BroadcastReceiver 每当电话状态从空闲、振铃、摘机时,这将呼叫您收到的电话,因此从以前的值和您可以检测到的新值是否是来电/去电。

所需的权限是"android.permission.READ_PHONE_STATE"

但如果您还想在该广播中接收EXTRA_INCOMING_NUMBER,则需要另一个权限:"android.permission.READ_CALL_LOG"

这是清单的接收者定义:

<receiver android:name="PhoneStateReceiver"> 
     <intent-filter>
          <action android:name="android.intent.action.PHONE_STATE"/>    
     </intent-filter>
</receiver>

代码如下:

public class PhoneStateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        ...
    }
}

【讨论】:

  • 外出通话怎么样?
  • 这段代码检测呼入和呼出,如果状态改变空闲=>响铃你知道这是一个来电,如果状态改变空闲=>摘机你知道这是一个呼出
【解决方案2】:

@marmor 答案是正确的,我只是想完成它。

首先要读取手机状态,我们应该将权限添加到清单中:

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

在接收器类中,我们可以通过读取意图来获取当前状态,如下所示:

intent.extras["state"]

额外的结果可能是:

RINGING -> 如果您的手机正在响铃

摘机 -> 如果您正在与某人通话(来电或去电)

IDLE -> 如果通话结束(来电或去电)

使用PHONE_STATE 广播,我们不需要使用PROCESS_OUTGOING_CALLS 权限或已弃用的NEW_OUTGOING_CALL 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    相关资源
    最近更新 更多