1 如何实现拦截电话呢?
本人是通过aidl和广播来实现的。先将电话监听的AIDL放进项目中。
2 然后再清单文件中配置:
<!--获取电话状态的权限-->
<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"/>
<!--获取手机通讯录的权限-->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".PhoneActivity" />
-<receiver android:name=".MyPhone">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
3使用反射技术来实现挂断电话 首先如果是要拦截的电话号码就得到电话管理者,然后再来电的广播中判断来电的状态,其次得到TelephonyManager的class对象允许访问私有方法,再调用getiTelephony方法发挥ITelephony方法,最后挂断电话。
代码如下:
public class MyPhone extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.PHONE_STATE".equals(intent.getAction())){
//获取电话号码
String number=intent.getStringExtra("incoming_number");
//电话管理者
TelephonyManager telephonyManager= (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//通话状态
int i=telephonyManager.getCallState();
switch (i) {
//响铃
case TelephonyManager.CALL_STATE_RINGING:
SharedPreferences sp=context.getSharedPreferences("spmyhaoma",Context.MODE_APPEND);
Set<String> ss=sp.getStringSet("setname",null);
if (ss!=null){
for (String s : ss) {
//截取空格
s=s.replace(" ","");
if (s.equals(number)){
//得到TelephonyManager的class对象
Class<TelephonyManager> t=TelephonyManager.class;
try {
//允许访问私有方法
Method m=t.getDeclaredMethod("getITelephony",
null);
m.setAccessible(true);
//调用getiTelephony方法发挥ITelephony方法
ITelephony it= (ITelephony) m.invoke(telephonyManager,null);
//挂断电话
it.endCall();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i("test","通话中");
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i("test","已挂断");
break;
}
}
}
}