黑名单短信和通话

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

 

posted @ 2016-10-13 14:53  一路向北中  阅读(348)  评论(0编辑  收藏  举报