您的位置:首页 > 其它

电话短信拦截

2015-06-24 14:35 211 查看
学习手机卫士的功能,做了个短信电话拦截的功能。
         <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必须在清单文件中注册,不要忘记

调用此服务即可拦截
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息