黑名单电话短信拦截实现
2015-12-04 12:19
363 查看
import java.lang.reflect.Method; import com.android.internal.telephony.ITelephony; import com.study.mobilesafe.db.dao.BlackNumberDao; 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.net.Uri; import android.os.Handler; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.SmsMessage; import android.telephony.TelephonyManager; public class BlackNumberService extends Service { private SmsReceiver receiver; private BlackNumberDao dao; private MyPhoneListener listener; private TelephonyManager manager; private class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Object[] objs = (Object[]) intent.getExtras().get("pdus"); for (Object obj : objs) { SmsMessage message = SmsMessage.createFromPdu((byte[]) obj); String sender = message.getOriginatingAddress(); int queryMode = dao.queryMode(sender); if (queryMode == BlackNumberDao.SMS || queryMode == BlackNumberDao.ALL) { abortBroadcast(); } } } } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); dao = new BlackNumberDao(getApplicationContext()); receiver = new SmsReceiver(); IntentFilter filter = new IntentFilter(); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(receiver, filter); manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); } // 电话状态发生改变调用这个方法 private class MyPhoneListener extends PhoneStateListener { @Override public void onCallStateChanged(int state,final String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_RINGING: int queryMode = dao.queryMode(incomingNumber); if (queryMode == BlackNumberDao.TEL || queryMode == BlackNumberDao.ALL) { endCall(); // 删除通话记录 // 不会立即生成通话记录--使用内容观察者 final Uri uri = Uri.parse("content://call_log/calls"); final ContentResolver resolver = getContentResolver(); resolver.registerContentObserver(uri, true, new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); resolver.delete(uri, "number=?", new String[] { incomingNumber }); // 不需要在观察了 resolver.unregisterContentObserver(this); } }); } break; default: break; } } } @Override public void onDestroy() { super.onDestroy(); manager.listen(listener, PhoneStateListener.LISTEN_NONE);// 取消监听 // 反注册短信广播接收者 if (receiver != null) { unregisterReceiver(receiver); receiver = null; } } /** * 挂断电话 */ public void endCall() { Class<?> loadClass = null; try { loadClass = BlackNumberService.class. getClassLoader().loadClass("android.os.ServiceManager"); Method declaredMethod = loadClass. getDeclaredMethod("getService",String.class); IBinder invoke = (IBinder) declaredMethod.invoke(null, Context.TELEPHONY_SERVICE); ITelephony asInterface = ITelephony.Stub.asInterface(invoke); asInterface.endCall(); } catch (Exception e) { e.printStackTrace(); } } }
相关文章推荐
- @"Xtrace: Tracing NSObject will not trace all classes"
- 可重入函数
- Mysql命令大全
- Android--Fragment与Activity通信
- XCode模拟器上下黑边、显示不完整、适配问题
- 将数据库id变为从1开始
- android 进程间通信方式
- Iperf使用方法
- 学自慕课网:MySQL开发技巧
- listView的convertView复用引发的问题解决
- 字典转模型的三种方法之一:赋值法
- ----------------------------1164---------------类似于,前些天做的,闰年生日的那一道题._______________________________________
- Handler、Message、Looper三者之间的关系
- 值得推荐的C/C++框架和库 (真的很强大)
- px与dp的转化
- Android 中的 Service 全面总结
- C++链接MySQL数据库查询操作
- 检测Xcode是否有问题
- 获取手机和内存卡可用空间
- asp.net实现从Txt文件读取数据到数据视图的方法