项目中需要在接收到来电之后把电话挂断,再做一些事情,在研究了Android源码以及参考了网络资料之后得出了如下方法:
1、定义并注册广播:
public void onReceive(final Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
//去电,可以用定时挂断
} else {
//来电
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {
Log.d(TAG, "--------coming call , end call!!!");
endCall(context);
}
}
}
注册广播:
<receiver
android:name="com.jerome.util.TelInternal"
android:enabled="true" >
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
增加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
完成如上操作就可以监听来电和去电了,很简单的。
2、挂断电话:
在研究了电话源码之后发现要挂断电话,需要调用ITelephony的endCall方法,可是ITelephony是拿到不的,怎么办呢?首先想到的是反射,网上的参考资料也是用反射,
先来看网上的方法:
private static ITelephony getITelephony(Context context) {
ITelephony iTelephony = null;
TelephonyManager mTelephonyManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
Class<TelephonyManager> c = TelephonyManager.class;
Method getITelephonyMethod = null;
Method[] m = c.getMethods();
for (int i = 0; i < m.length; i++) {
Log.i("jerome", "" + m[i].getName() + "____"
+ m[i].getReturnType().getName());
}
try {
//这种方法没有测试成功,直接将源码拷贝过来了;
getITelephonyMethod =c.getDeclaredMethod("getITelephony",(Class[])null); // 获取声明的方法
getITelephonyMethod.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
return iTelephony;
}
可是我在Android4.2版本上没有编译成功,就是用反射拿不到拿不到getITelephony方法,进源码看一下getITelephony():
private ITelephony getITelephony() {
return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
}
里面就一句话,好吧,那句直接把这句话拷贝过来,看能不能调用,但结果是不行,因为ServiceManager你是无法拿到的。好吧,上绝招,见图:
没错,就是引入ServiceManager类。
实现如下:
private ITelephony getITelephony(Context context) {
ITelephony iTelephony = null;
try {
iTelephony = ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
} catch (Exception e) {
e.printStackTrace();
}
return iTelephony;
}
这样就可以拿到ITelephony对象了。注意我是引入了ITelephony.aidl和NeighboringCellInfo.aidl。
private void endCall(Context context) {
AudioManager mAudioManager = (AudioManager) context
.getSystemService(Context.AUDIO_SERVICE);
// 先静音处理
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
try {
ITelephony iTelephony = getITelephony(context);
if (null != iTelephony) {
iTelephony.endCall(); // 挂断电话
}
} catch (Exception e) {
e.printStackTrace();
}
// 再恢复正常铃声
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
}
好了,这样就可以拦截并挂断电话了,再根据你记录的黑名单,就可以实现指定电话拦截功能了。祝你好运~!
有什么问题可以留言给我。
- 大小: 9.6 KB
分享到:
相关推荐
在Android平台上,实现来电自动挂断并回复短信的功能涉及到多个技术层面,主要涵盖电话管理和短信管理API的使用,以及系统权限的申请。以下是对这些知识点的详细解释: 1. **电话反射机制**: Android系统为了安全...
在Android平台上,实现自动接听和挂断电话的功能主要涉及到电话管理和服务组件的使用。这个功能在某些场景下非常有用,比如在驾驶时自动接听电话,或者在自动化测试中模拟用户行为。下面我们将深入探讨如何在Android...
`ITelephony`是Android系统内部的一个服务接口,它提供了对电话通话进行控制的能力,如挂断电话、接听电话等。然而,由于安全性和隐私保护的原因,Google在Android 2.1及以后的SDK版本中,默认将这个接口隐藏了起来...
由于涉及到敏感的电话操作,直接使用`ITelephony.aidl`通常需要特殊的权限,如`android.permission.MODIFY_PHONE_STATE`,普通应用通常无法获取此权限,除非是在设备上具有系统级权限的自定义ROM或者系统应用。...
综上所述,开发一个Android自动接听电话的程序涉及到权限管理、来电监听、系统服务、广播接收器以及电话API的使用。通过这些技术,我们可以构建一个实用的应用,帮助用户在特定条件下自动接听电话。在实际开发中,...
3. 接听电话:自动接听来电。 4. 获取通话状态:查询当前的通话状态,如空闲、拨号中、通话中等。 5. 发送短信:发送文本消息到指定号码。 6. 读取通话记录:获取通话记录列表,包括呼入、呼出和未接电话。 7. 开启/...
除了简单的黑白名单机制,还可以设置更复杂的规则,如时间条件(例如,在特定时间段内拦截所有来电)、特定事件触发(例如,当设备处于静音模式时自动拦截所有来电)等。这些策略可以通过用户界面配置,并保存在应用...
挂断电话可以在通话结束时自动挂断电话,提高用户体验。 7. Android2.3及以上版本的实现 在Android2.3及以上版本中,需要使用Intent来实现电话控制操作,例如使用android.intent.action.MEDIA_BUTTON意图来控制...
4. **自动挂断**:若需要在特定条件下挂断电话,可以调用`hangupCall()`方法。这同样需要通过`ITelephony`接口实现,代码结构类似接听电话的实现。 5. **处理来电广播**:除了使用电话状态监听器,还可以通过注册...
然而,由于涉及敏感的电话操作,直接使用`ITelephony.aidl`通常需要系统的特殊权限,例如`android.permission.MODIFY_PHONE_STATE`。在手机安全卫士中,`ITelephony.aidl`可以用于实现来电拦截、防止骚扰电话等功能...
总结,实现Android自动接听电话和挂断电话的功能,关键在于正确使用`BroadcastReceiver`监听电话状态,`AudioManager`控制音频模式,以及通过`ITelephony`接口挂断电话。这个功能需要处理多个权限和系统级别的交互,...
当监听到电话状态变为 ringing(来电)时,源码可能会使用`TelephonyManager.endCall()`方法挂断现有通话,然后用`AudioManager`调整音频流以播放预设的接听语音,最后调用`ITelephony`接口的`acceptCall()`方法...
同时,该接口还可以用于监控来电状态,当有新来电时,如果满足预设的拦截条件(如黑名单号码),则可以自动挂断。 实现电话拦截的过程通常包括以下步骤: 1. **获取权限**:首先,应用需要在AndroidManifest.xml中...
在Android平台上,自动接听或挂断电话是一种常见需求,尤其对于开发者来说,这涉及到系统级的权限和接口调用。本项目"PhoneCallDemo"提供了一个完整的解决方案,它能够自动处理来电,包括自动接听和挂断操作。让我们...
在来电时,如果希望拦截,只需不调用`acceptCall()`,来电就会被自动挂断。 4. **设置提示音**:拦截来电后,为了告知用户,我们可以播放自定义的提示音。这通常需要使用`MediaPlayer`类来加载和播放音频文件。确保...
在Android平台上,开发一款能够自动接听和挂断电话的应用是一个相当实用的功能,尤其对于那些经常忙于工作而无法及时处理来电的用户。本压缩包文件包含的源码为我们提供了实现这一功能的实例,让我们深入探讨其中...
在Android系统中,来电防火墙是一种能够帮助用户自动拦截特定号码来电的应用程序。它通过深入到系统的底层,利用Android的电话服务和权限管理机制来实现这一功能。下面将详细讲解如何使用Android源码来实现这样的...
对于挂断来电,通常需要访问到系统的电话服务(ITelephony)。由于这个接口是私有的,我们不能直接调用,需要通过反射机制来实现。创建一个名为`BlockCallHelper`的工具类,包含以下代码: ```java public final ...
在Android系统中,`NeighboringCellInfo`和`ITelephony`是两个重要的接口,它们主要用于处理手机通信相关的功能。这两个接口定义在`.aidl`(Android Interface Definition Language)文件中,这是一种用于跨进程通信...
所有来电自动挂断; 3.开启/关闭Radio; 4.开启/关闭数据连接(WAP or NET的连接)。 调用TelephonyManager的隐藏API是先参考Framework的/base/telephony/java/com/android/internal/telephony/ITelephony.aidl...