关于在android中检测传入和传出呼叫有很多问题,但是它们都比较老,并且android弃用了有用的功能,并且Google play拒绝了我的应用程序,因为我正在使用它们。
用于检测我使用的拨出电话:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
并收听android.intent.action.NEW_OUTGOING_CALL
广播收听者。
根据google文档(this),我们应该使用CallRedirectionService
和CallScreeningService
。但是这些服务只能在API 29+上运行。
那么,有什么方法可以检测不弃用也不使用敏感权限的呼入和呼出电话?
如果有任何呼叫,我想关闭我的套接字连接,否则,请重新打开它。
答案 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
操作。