如何在安卓系统中屏蔽电话呼入

75

我希望屏蔽来自几个号码的电话,因此我想要编写自己的应用程序。 那么我应该使用哪些API呢?

基本上,我希望在电话到来时收到通知,我想比较号码是否为我所要屏蔽的号码,我想挂断或静音电话,如果可能的话,还想将其静音并录音。


我认为可以阻止来电。试试这个链接:https://dev59.com/gWw05IYBdhLWcg3wpDRu#7121586 - Vineet Shukla
https://dev59.com/80zSa4cB1Zd3GeqPmnGm#5268927 - Muhammad Babar
请取消接受错误的答案,这可能会让一些人感到困惑,因为被接受的答案并不正确。 - ayanami
请查看下面的更新答案:[https://dev59.com/FXNA5IYBdhLWcg3wH6EW#35912862]。 - Amit Vaghela
5个回答

65

天啊!!!是的,我们能做到!!!经过24个小时的调查和发现,我以前要自杀了...但是我找到了一个“新鲜”的解决方案!

// "cheat" with Java reflection to gain access to TelephonyManager's
// ITelephony getter
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony)m.invoke(tm);

成百上千的想要开发通话控制软件的人都会访问这个起点

有一个项目,还有一些重要的注释(和致谢)

简单地说:复制AIDL文件,将权限添加到清单中,复制-粘贴电信管理源代码 )))

更多的信息:只有当你已经root手机时才能发送AT命令。然后你可以杀掉系统进程并发送指令,但是你需要重新启动手机才能接收和发送电话呼叫 =)))

我很高兴 =) 现在我的Shake2MuteCall将得到更新!


6
即使那个方法奏效,对我来说似乎有点冒险。每当内部API发生更改时,您的应用程序可能会在不通知您的情况下出现故障。 - Guido
4
那是因为Google Code已被关闭。这正是人们在这里警告链接失效的原因。在你的帖子中发布任何相关内容。你可能认为Google是你可以信任永远存在的一个来源,但正如你所看到的,甚至他们的链接也会失效。 - o_O
有没有一种方法可以将电话呼叫转移到语音邮件? - powder366
在方法 m = c.getDeclaredMethod("getITelephony") 处出现 NoSuchMethodException。如何避免它? - uniruddh
最后一行的ITelephony是什么?请回复,我无法导入它。 - Shirish Herwade

4
在Android-N中,该功能已包含在其中。查看Android N号码屏蔽更新。

Android N现在支持平台上的号码屏蔽,并提供框架API,使服务提供商可以维护阻止号码列表。默认SMS应用程序、默认电话应用程序和提供程序应用程序都可以从阻止的号码列表中读取和写入。该列表对其他应用程序不可访问。

其优点如下:

  1. 拦截呼叫时也会拦截短信
  2. 被拦截的号码可以通过备份和还原功能在重置和设备之间保留
  3. 多个应用程序可以使用相同的被阻止号码列表

有关更多信息,请参见android.provider.BlockedNumberContract

更新现有项目。

要针对Android N平台编译您的应用程序,您需要使用Java 8 Developer Kit (JDK 8),并且为了在Android Studio 2.1中使用一些工具,您需要安装Java 8 Runtime Environment (JRE 8)

打开您的模块的 build.gradle 文件,并按以下方式更新值:

android {
  compileSdkVersion 'android-N'
  buildToolsVersion 24.0.0 rc1
  ...

  defaultConfig {
     minSdkVersion 'N'
     targetSdkVersion 'N'
     ...
  }
  ...
}

这篇文章中的链接无效!它们都返回404未找到页面! - hadilq
截至此评论,您可以在以下链接中查看:https://developer.android.com/about/versions/nougat/android-7.0.html#number-blocking https://developer.android.com/reference/android/provider/BlockedNumberContract.html 同时发现呼叫筛选相关:https://developer.android.com/about/versions/nougat/android-7.0.html#call_screening - Joel McBeth

4

这是可能的,而且你不需要自己编码。

只需将铃声音量设置为零,并将振动设置为无,如果incomingNumber等于空字符串。就这样...

使用Android Market中的应用程序Nostalk,这一切都已经为您完成了。试试看吧...


8
请问您需要翻译什么内容呢? - Anurag Uniyal
2
这并不难...如果你查看SDK参考文档,就会发现有一个onCallStateChangeListener()方法,它需要在你的应用程序中进行注册。一旦注册完成,它将向你传递来电状态(callState),可能是IDLE(空闲)、RINGING(响铃)或OFF_HOOK(摘机)之一。除此之外,监听器还会向你传递来电号码(incomingNumber)。这就是你可以采取行动的时机。不幸的是,SDK实际上并没有提供直接挂断电话的选项,这些功能并不对公众开放,以某种方式隐藏起来,无法访问。 - user176167

3
你可以将通讯录中特定的号码重定向到语音信箱。这已经得到支持。
否则,我想“联系人”文档可能是开始寻找的好地方。

0

您可以通过监听电话事件来实现。您需要创建一个广播接收器来监听PHONE_STATE和NEW_OUTGOING_CALL事件,从中获取电话号码。

当您决定结束通话时,这有点棘手,因为只有在Android P及以上版本中才能保证正常工作。请参考此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接