android143 360 短信电话拦截
package com.itheima.mobileguard.services; import java.lang.reflect.Method; import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.location.Address;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast; import com.android.internal.telephony.ITelephony;
import com.itheima.mobileguard.db.dao.BlackNumberDao;
import com.itheima.mobileguard.db.dao.NumberAddressDao; public class CallSmsSafeService extends Service {
private InnerSmsReceiver receiver;
private BlackNumberDao dao;
//系统提供的电话管理器,电话管理的服务
private TelephonyManager tm;
private MyPhoneListener listener; @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
dao = new BlackNumberDao(this);
//后台运行一个服务
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
listener = new MyPhoneListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//设置电话监听器
//短信的广播接受者
receiver = new InnerSmsReceiver();
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(Integer.MAX_VALUE);//优先级最大
registerReceiver(receiver, filter);
super.onCreate();
} private class MyPhoneListener extends PhoneStateListener{//电话状态监听器
@Override
public void onCallStateChanged(int state, final String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://空闲状态
break;
case TelephonyManager.CALL_STATE_RINGING://响铃状态
String mode = dao.findBlockMode(incomingNumber);//incomingNumber电话号码
if("1".equals(mode)||"3".equals(mode)){
Log.i("MyPhoneListener","挂断电话");
//观察(另外一个应用程序数据库的变化)呼叫记录的变化,如果呼叫记录生成了,就把呼叫记录给删除掉。
Uri uri = Uri.parse("content://call_log/calls");
getContentResolver().registerContentObserver(uri, true, new CallLogObserver(new Handler(), incomingNumber));
//用代码挂断电话。
endCall();//电话挂断之后,会在另外一个应用程序里面生成呼叫记录。
//清除黑名单号码产生的呼叫记录 }
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接通状态 break;
}
}
} private class CallLogObserver extends ContentObserver{
private String incomingNumber;
public CallLogObserver(Handler handler,String incomingNumber) {
super(handler);
this.incomingNumber = incomingNumber;
}
//观察到数据库内容变化调用的方法
@Override
public void onChange(boolean selfChange) {
Log.i("CallLogObserver","呼叫记录数据库的内容变化了。");
getContentResolver().unregisterContentObserver(this);
deleteCallLog(incomingNumber);
super.onChange(selfChange);
}
} @Override
public void onDestroy() {
unregisterReceiver(receiver);
receiver = null;
tm.listen(listener, PhoneStateListener.LISTEN_NONE);
listener = null;
super.onDestroy();
} /**
* 清除呼叫记录
* @param incomingNumber
*/
public void deleteCallLog(String incomingNumber) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://call_log/calls");
resolver.delete(uri, "number=?", new String[]{incomingNumber});
} /**
* 挂断电话
*/
public void endCall() {
try {
Class clazz = getClassLoader().loadClass("android.os.ServiceManager");//ServiceManager在代码里面点不进去,但是源码有这个类,
Method method = clazz.getDeclaredMethod("getService", String.class);
IBinder iBinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);//TELEPHONY_SERVICE="phone"
ITelephony itelephony = ITelephony.Stub.asInterface(iBinder);//ITelephony.aidl是通过源码复制的。
itelephony.endCall();
//开通呼叫转移
} catch (Exception e) {
e.printStackTrace();
}
} private class InnerSmsReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.i("InnerSmsReceiver","短信到来了。");
//判断短信的发件人是否在黑名单列表里面,
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for(Object obj :objs){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
String sender = smsMessage.getOriginatingAddress();//拿到短信的电话号码
String mode = dao.findBlockMode(sender);//模式
if("1".equals(mode)||"2".equals(mode)){
Log.i("InnerSmsReceiver","黑名单短信被拦截。");
abortBroadcast();//终止短信的广播 ,短信就被拦截
}
//智能拦截。
String body = smsMessage.getMessageBody();//拿到短信的内容
if(body.contains("发票")){ //你的头发票亮极了。
Log.i("InnerSmsReceiver","拦截到垃圾发票短信,终止");
abortBroadcast();//终止短信的广播 ,短信就被拦截
}
}
}
}
}
ITelephony.aidl
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ package com.android.internal.telephony; import android.os.Bundle;
import java.util.List;
import android.telephony.NeighboringCellInfo; /**
* Interface used to interact with the phone. Mostly this is used by the
* TelephonyManager class. A few places are still using this directly.
* Please clean them up if possible and use TelephonyManager insteadl.
*
* {@hide}
*/
interface ITelephony { /**
* Dial a number. This doesn't place the call. It displays
* the Dialer screen.
* @param number the number to be dialed. If null, this
* would display the Dialer screen with no number pre-filled.
*/
void dial(String number); /**
* Place a call to the specified number.
* @param number the number to be called.
*/
void call(String number); /**
* If there is currently a call in progress, show the call screen.
* The DTMF dialpad may or may not be visible initially, depending on
* whether it was up when the user last exited the InCallScreen.
*
* @return true if the call screen was shown.
*/
boolean showCallScreen(); /**
* Variation of showCallScreen() that also specifies whether the
* DTMF dialpad should be initially visible when the InCallScreen
* comes up.
*
* @param showDialpad if true, make the dialpad visible initially,
* otherwise hide the dialpad initially.
* @return true if the call screen was shown.
*
* @see showCallScreen
*/
boolean showCallScreenWithDialpad(boolean showDialpad); /**
* End call or go to the Home screen
*
* @return whether it hung up
*/
boolean endCall(); /**
* Answer the currently-ringing call.
*
* If there's already a current active call, that call will be
* automatically put on hold. If both lines are currently in use, the
* current active call will be ended.
*
* TODO: provide a flag to let the caller specify what policy to use
* if both lines are in use. (The current behavior is hardwired to
* "answer incoming, end ongoing", which is how the CALL button
* is specced to behave.)
*
* TODO: this should be a oneway call (especially since it's called
* directly from the key queue thread).
*/
void answerRingingCall(); /**
* Silence the ringer if an incoming call is currently ringing.
* (If vibrating, stop the vibrator also.)
*
* It's safe to call this if the ringer has already been silenced, or
* even if there's no incoming call. (If so, this method will do nothing.)
*
* TODO: this should be a oneway call too (see above).
* (Actually *all* the methods here that return void can
* probably be oneway.)
*/
void silenceRinger(); /**
* Check if we are in either an active or holding call
* @return true if the phone state is OFFHOOK.
*/
boolean isOffhook(); /**
* Check if an incoming phone call is ringing or call waiting.
* @return true if the phone state is RINGING.
*/
boolean isRinging(); /**
* Check if the phone is idle.
* @return true if the phone state is IDLE.
*/
boolean isIdle(); /**
* Check to see if the radio is on or not.
* @return returns true if the radio is on.
*/
boolean isRadioOn(); /**
* Check if the SIM pin lock is enabled.
* @return true if the SIM pin lock is enabled.
*/
boolean isSimPinEnabled(); /**
* Cancels the missed calls notification.
*/
void cancelMissedCallsNotification(); /**
* Supply a pin to unlock the SIM. Blocks until a result is determined.
* @param pin The pin to check.
* @return whether the operation was a success.
*/
boolean supplyPin(String pin); /**
* Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated
* without SEND (so <code>dial</code> is not appropriate).
*
* @param dialString the MMI command to be executed.
* @return true if MMI command is executed.
*/
boolean handlePinMmi(String dialString); /**
* Toggles the radio on or off.
*/
void toggleRadioOnOff(); /**
* Set the radio to on or off
*/
boolean setRadio(boolean turnOn); /**
* Request to update location information in service state
*/
void updateServiceLocation(); /**
* Enable location update notifications.
*/
void enableLocationUpdates(); /**
* Disable location update notifications.
*/
void disableLocationUpdates(); /**
* Enable a specific APN type.
*/
int enableApnType(String type); /**
* Disable a specific APN type.
*/
int disableApnType(String type); /**
* Allow mobile data connections.
*/
boolean enableDataConnectivity(); /**
* Disallow mobile data connections.
*/
boolean disableDataConnectivity(); /**
* Report whether data connectivity is possible.
*/
boolean isDataConnectivityPossible(); Bundle getCellLocation(); /**
* Returns the neighboring cell information of the device.
*/
List<NeighboringCellInfo> getNeighboringCellInfo(); int getCallState();
int getDataActivity();
int getDataState(); /**
* Returns the current active phone type as integer.
* Returns TelephonyManager.PHONE_TYPE_CDMA if RILConstants.CDMA_PHONE
* and TelephonyManager.PHONE_TYPE_GSM if RILConstants.GSM_PHONE
*/
int getActivePhoneType(); /**
* Returns the CDMA ERI icon index to display
*/
int getCdmaEriIconIndex(); /**
* Returns the CDMA ERI icon mode,
* 0 - ON
* 1 - FLASHING
*/
int getCdmaEriIconMode(); /**
* Returns the CDMA ERI text,
*/
String getCdmaEriText(); /**
* Returns true if CDMA provisioning needs to run.
*/
boolean getCdmaNeedsProvisioning(); /**
* Returns the unread count of voicemails
*/
int getVoiceMessageCount(); /**
* Returns the network type
*/
int getNetworkType(); /**
* Return true if an ICC card is present
*/
boolean hasIccCard();
}
android143 360 短信电话拦截的更多相关文章
- Android开发——短信电话拦截/接听电话
1.短信拦截 首先需要声明的是,Android4.4版本以上,如果想做到短信拦截,必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截.但这种做法,适配性和兼容性的工作是非常 ...
- Android学习笔记_19_广播接收者 BroadcastReceiver及其应用_窃听短信_拦截外拨电话
一.广播接收者类型: 广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”. 普通广播是完全异步的,可以在同一时刻(逻辑上 ...
- Python短信电话报警
sid 和token 需要自己去https://www.twilio.com/try-twilio注册twilio 账号申请是免费的 from后面的电话也是官方提供的 直接看脚本 # -*-cond ...
- Arduino 各种模块篇 GPRS module 手机模块 短信 电话 上网 for texting, calling, internet
---恢复内容开始--- The GPRS shield which I tested is one which looks like this: ---恢复内容结束--- Need to be re ...
- Android -- 怎么发出和接收广播, Broadcast, 电话拨号拦截,短信拦截
1. 发送广播 使用以下三个API可以发送广播 public void click(View view){ Intent intent = new Intent(); intent.setAction ...
- [android] 手机卫士黑名单功能(短信拦截)
前面我们把需要拦截的手机号都存储和展示出来了,接下来是使用广播接收者拦截短信了,这个广播接收者需要和一个服务绑定,服务开启的时候,接收者存在,服务停掉时,接收者关闭 在service包下定义一个类Ca ...
- Android 短信拦截及用途分析
监听系统短信这个只能作为一个技术点来研究下,读者可能在工作中可能不会哦涉及到,一般的应用软件也不会有这个需求 但是作为程序员呢,多了解一下也是好的. Android 监听系统短信有什么用? 1.对系统 ...
- atitit.破解 拦截 绕过 网站 手机 短信 验证码 之自动获取手机短信方式 attilax 总结
atitit.破解 拦截 绕过 网站 手机 短信 验证码 之自动获取手机短信方式 attilax 总结 1. 自动获取手机短信方式的原理 1 2. 调用api 1 3. ----核心代码 2 4. ...
- Android 短信监听及用途分析
监听系统短信这个只能作为一个技术点来研究下,读者可能在工作中可能不会哦涉及到,一般的应用软件也不会有这个需求 但是作为程序员呢,多了解一下也是好的. Android 监听系统短信有什么用? 1.对系统 ...
随机推荐
- Android和iOS隐藏状态条
Android: 在 AndroidManifest.xml 里 <activity android:theme="@android:style/Theme.NoTitleBar.Fu ...
- C++一些特殊的类的设计
一.设计一个只能在栈上分配空间的类 重写类的opeator new 操作,并声明为private,一个大概的代码如下: class StackOnly { public: StackOnly(){ ...
- C++设计模式——建造者模式
建造者模式 在GOF的<设计模式 可复用面向对象软件的基础>中是这样说的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 这句话,似懂非懂的.一个复杂对象的创建 ...
- CDH5.5.1 安装Spark ON Yarn环境
CDH对我们已经封装了,我们如果需要Spark on Yarn,只需要yum安装几个包就可以了. 前面的文章我有写过如果搭建自己内网的CDH Yum服务器,请参考<CDH 5.5.1 Yum源服 ...
- Static块详解
首先,我们先看一段程序,代码如下: public class Father { public Father() //构造方法 { System.out.println(" 父类构造方法&qu ...
- 第二百六十一、二天 how can I坚持
昨天在家宅了一天,晚上去看了个电影<寻龙诀>,感觉一般,虽然有黄渤.舒淇.十分打7分吧,画面倒是很震撼. 今天,去了趟东升八家郊野公园,想买个篮球玩玩来,可是超市里的太坑了,都是赠品还拿出 ...
- 通过request读取所有参数
获取request里的所有参数及参数名(参数名自动获取) - [ Java ] request里有两个方法: 1)request.getParameterMap(); Enumeration en ...
- STC89c52RC 的EEPROM和AVR的EEPROM
二者的EEPROM不是一回事,AVR片内的EEPROM是独立于程序存储器的数据存储器,本身不能存储程序并运行,但现代MCU很多支持IAP,利用IAP技术可在程序存储空间实现数据存储即替代EEPROM, ...
- [iOS 多线程 & 网络 - 2.1] - 解析json
A.iOS中json的基本使用 1.解析json数据 (1)json反序列化 对象{}格式 {key : value, key : value,...} 的键值对的结构可以反序列化为OC中的NSDic ...
- 位运算&字节运算