public class BlackNameService extends Service {
private SmsReceiver mReceiver;
private TelephonyManager mTm;
private BlackNamePhoneStateListener mListener;
@Override
public void onCreate() {
//4.4 失效
mReceiver = new SmsReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mReceiver, filter);
//
mTm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mListener = new BlackNamePhoneStateListener();
mTm.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
class BlackNamePhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
Log.i(TAG, "onCallStateChanged: " + incomingNumber);
endCall();
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
private void endCall() {
//ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
//ServiceManager此类android对开发者隐藏,所以不能去直接调用其方法,需要反射调用
try {
//1,获取ServiceManager字节码文件
Class<?> clazz = Class.forName("android.os.ServiceManager");
//2,获取方法
Method method = clazz.getMethod("getService", String.class);
//3,反射调用此方法
IBinder iBinder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);
//4,调用获取aidl文件对象方法
ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);
//5,调用在aidl中隐藏的endCall方法
iTelephony.endCall();
Log.i(TAG, "endCall: ");
} catch (Exception e) {
e.printStackTrace();
}
}
class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "onReceive: sms---------");
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object obj : pdus) {
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
String number = smsMessage.getOriginatingAddress();
Log.i(TAG, "onReceive: number " + number);
}
abortBroadcast();
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
if (mReceiver != null) {
unregisterReceiver(mReceiver);
}
if (mListener != null && mTm != null) {
mTm.listen(mListener, PhoneStateListener.LISTEN_NONE);
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}