电话短信拦截


学习手机卫士的功能,做了个短信电话拦截的功能。

        

<span style="font-size:12px;">public class CallSmsSafeService extends Service {
private InnerSmsReceiver receiver;
private String TAG = "CallSmsSafeService";
private BlackNumberDao dao;

private TelephonyManager tm;
private MyListener mListener;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    private class InnerSmsReceiver extends BroadcastReceiver{

        

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(TAG,"有短信来了");
            //检查发件人是否所黑名单号码
            Object [] objs=(Object[]) intent.getExtras().get("pdus");
            for(Object obj:objs){
                SmsMessage sms=SmsMessage.createFromPdu((byte[]) obj);
                String sender=sms.getOriginatingAddress();
                String mode=dao.findMode(sender);
                if ("2".equals(mode) || "3".equals(mode)) {
                    Log.i(TAG,"拦截短信");
                    abortBroadcast();//屏蔽广播
                }
            }
            
        }
        
    }

    @Override
    public void onCreate() {
        dao= new BlackNumberDao(getApplicationContext());
        receiver= new InnerSmsReceiver();
        IntentFilter filter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        registerReceiver(receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
        
        tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        mListener=new MyListener();
        tm.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);
        super.onCreate();
    } 
    @Override
    public void onDestroy() {
        unregisterReceiver(receiver);
        receiver=null;
        super.onDestroy();
    }
    private class MyListener extends PhoneStateListener{
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:   //零响状态
                String result=dao.findMode(incomingNumber);
                if ("1".equals(result) || "3".equals(result)) {
                    endCall();
                }
                break;

            }
            super.onCallStateChanged(state, incomingNumber);
        }
    }
    /** 
     * 挂断电话 
     */  
    private void endCall()  
    {  
        try  
        {  
                //加载service的字节码
                Class cla=CallSmsSafeService.class.getClassLoader().loadClass("android.os.ServiceManager");
            Method method = cla.getDeclaredMethod("getService", String.class);  
            IBinder iBinder=(IBinder) method.invoke(null, TELEPHONY_SERVICE);
            ITelephony.Stub.asInterface(iBinder).endCall();  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();
       //     Log.e(TAG, "Fail to answer ring call.", e);  
        }          
    } 
    
}


</span>

endCall自从1.1之后被谷歌隐藏,必须新建package:com.android.internal.telephony,新建文件ITelephony.aidl 在文件里添加

<span style="font-size:12px;">package com.android.internal.telephony;  
    interface ITelephony{  
        boolean endCall();  
        void answerRingingCall();  
         } </span>
在gen目录下会出现com.android.internal.telephony,里面有ITelephony.java
最后拦截电话需要权限CALL_PHONE


还有service必须在清单文件中注册,不要忘记

调用此服务即可拦截

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值