在android API29中检测传入和传出呼叫

时间:2020-06-30 08:53:02

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

关于在an​​droid中检测传入和传出呼叫有很多问题,但是它们都比较老,并且android弃用了有用的功能,并且Google play拒绝了我的应用程序,因为我正在使用它们。

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

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

并收听android.intent.action.NEW_OUTGOING_CALL广播收听者。

根据google文档(this),我们应该使用CallRedirectionServiceCallScreeningService。但是这些服务只能在API 29+上运行。

那么,有什么方法可以检测不弃用也不使用敏感权限的呼入和呼出电话?

如果有任何呼叫,我想关闭我的套接字连接,否则,请重新打开它。

2 个答案:

答案 0 :(得分:2)

您需要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) {
        ...
    }
}

答案 1 :(得分:1)

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

首先要读取电话状态,我们应该在清单中添加权限:

with GNAT.OS_Lib;
procedure main is
   Exit_Code : Integer;
begin
   Exit_Code := GNAT.OS_Lib.Spawn (Program_Name => "mv", Args => (new String'("README.md"), new String'("README.txt")));
   if Exit_Code /= 0 then
      raise Program_Error with "Exit code:" & Exit_Code'Image;
   end if;
end main;

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

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

临时演员的结果可能是:

正在响铃->如果您的电话正在响铃

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

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

有了intent.extras["state"] 广播,我们不需要使用PHONE_STATE权限或不赞成使用的PROCESS_OUTGOING_CALLS操作。