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; } }