day5.10总结_短信和电话拦截
2016-05-16 22:57
288 查看
短信和电话拦截
public class MainActivity extends Activity { EditText et; DBUtil util; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et=(EditText) findViewById(R.id.editText1); util=new DBUtil(this); } public void add(View v){ String number = et.getText().toString(); if(TextUtils.isEmpty(number)){ return; } util.addBlck(number); } public void start(View v){ Intent intent = new Intent(this,MyService.class); startService(intent); } public void stop(View v){ Intent intent = new Intent(this,MyService.class); stopService(intent); } } |
public class MyService extends Service { DBUtil dbUtil; MyReceive receive; ITelephony telephony; TelephonyManager manager; public MyService() {} @Override public void onCreate() { Log.i("tag", "服务创建了!"); dbUtil = new DBUtil(this); manager=(TelephonyManager) getSystemService(TELEPHONY_SERVICE); try { Method method = manager.getClass().getDeclaredMethod("getITelephony", null); method.setAccessible(true); 反射调用方法 telephony = (ITelephony) method.invoke(manager, null); } catch (Exception e) { e.printStackTrace(); } IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED");接受短信 filter.addAction("android.intent.action.NEW_OUTGOING_CALL");呼出电话 filter.addAction("android.intent.action.PHONE_STATE");来电的状态 filter.setPriority(999); receive=new MyReceive(); registerReceiver(receive, filter); super.onCreate(); } @Override public void onDestroy() { Log.i("tag", "服务销毁了!"); unregisterReceiver(receive); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return Service.START_FLAG_REDELIVERY; } public class MyReceive extends BroadcastReceiver{ @Override public void onReceive(final Context context, Intent intent) { String action =intent.getAction(); if("android.provider.Telephony.SMS_RECEIVED".equals(action)){ String number = dbUtil.getNumberFromSMS(intent.getExtras()); Log.i("tag", "短信发送人:"+number); if(dbUtil.isBlackNumber(number)){ abortBroadcast(); Toast.makeText(MyService.this, "短信已被拦截!", 1); dbUtil.saveBlackSms(intent.getExtras()); } } if("android.intent.action.NEW_OUTGOING_CALL".equals(action)){ String number = getResultData(); if(dbUtil.isBlackNumber(number)){ setResultData(null); 设置电话号码为空 Toast.makeText(MyService.this, "电话已被拦截!", 1); dbUtil.saveBlackPhone(number,1); } } if("android.intent.action.PHONE_STATE".equals(action)){ String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ final String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); if(dbUtil.isBlackNumber(number)){ try { telephony.endCall(); } catch (RemoteException e) { e.printStackTrace(); } dbUtil.saveBlackPhone(number,2); new Handler().postDelayed(new Runnable() { @Override public void run() { dbUtil.removeCalllog(context,number); } 延迟删除,以防通话记录还没插入数据库就被删除 }, 3000); } } } } } } ba16 |
public class DBUtil { private Context context; private DBHelper dbHelper; public DBUtil(Context context){ this.context=context; dbHelper=DBHelper.getInstance(context); } public void addBlck(String number){ SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values =new ContentValues(); values.put("number", number); db.insert("tb_blacklist", "null", values ); Toast.makeText(context, "数据添加成功!", 1).show();; } public String getNumberFromSMS(Bundle extras) { Object[] pdus = (Object[]) extras.get("pdus"); String number =""; for (int i = 0; i < pdus.length; i++) { SmsMessage message =SmsMessage.createFromPdu((byte[]) pdus[i]); number= message.getDisplayOriginatingAddress(); } return number; } public boolean isBlackNumber(String number) { boolean result = false; SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("tb_blacklist", null, "number=?", new String[]{number}, null, null, null); if(cursor.moveToNext()){ result= true; } cursor.close(); return result; } public void saveBlackSms(Bundle extras) { String number = getNumberFromSMS(extras); StringBuilder sb = new StringBuilder(); Object[] pdus = (Object[]) extras.get("pdus"); for (int i = 0; i < pdus.length; i++) { SmsMessage message =SmsMessage.createFromPdu((byte[]) pdus[i]); sb.append(message.getDisplayMessageBody()); } SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values =new ContentValues(); values.put("number", number); values.put("body", sb.toString()); values.put("date", System.currentTimeMillis()); db.insert("tb_blcksms", null, values ); } public void saveBlackPhone(String number, int type) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values =new ContentValues(); values.put("number", number); values.put("type", type); values.put("date", System.currentTimeMillis()); db.insert("tb_blckphone", null, values); } public void removeCalllog(Context context2, String number) { ContentResolver cr = context.getContentResolver(); cr.delete(CallLog.Calls.CONTENT_URI, CallLog.Calls.NUMBER+"=?", new String[]{number}); } } |
public class DBHelper extends SQLiteOpenHelper { private static DBHelper instance; public static DBHelper getInstance(Context context){ if(instance==null){ synchronized (DBHelper.class){ 创建单例并且同步 if(instance==null){ instance=new DBHelper(context); } } } return instance; } public DBHelper(Context context) { super(context, "black.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { String sql1= "create table if not exists tb_blacklist(_id integer primary key autoincrement," + "number text not null)"; db.execSQL(sql1); String sql2="create table if not exists tb_blcksms(_id integer primary key autoincrement," + "date integer not null," + "body text not null," + "number text not null)"; db.execSQL(sql2); String sql3="create table if not exists tb_blckphone(_id integer primary key autoincrement," + "date integer not null," + "number text not null," + "type integer not null)"; db.execSQL(sql3); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } |
ITelephony.aidl package com.android.internal.telephony; 远程调用系统的电话的方法 interface ITelephony{ boolean endCall(); void answerRingingCall(); } |
相关文章推荐
- 简单工厂模式
- 水222
- Ubuntu下用pyenv进行python环境隔离
- netstat命令
- DP 动态规划 Problem E 1005 最大递增子序列
- SQL 递归查询所有父子节点
- 图论-最小费用流
- 程序的简述1
- poj1159非标准回文串解题思路,然后又变的标准了
- hdu2830 Matrix Swapping II 【dp】
- jQuery学习日记---第三篇 JS实现导航条点击以后会高亮显示
- Android APP在手机桌面点不开
- CodeForces 608B Hamming Distance Sum(前缀和)
- 团体程序设计天梯赛-练习集 L2-007 家庭房产
- R-CNN、Fast-R-CNN和Faster-R-CNN
- 取得IOS设备型号
- VMWare低版本无法打开高版本虚拟机vmx解决方案
- 安卓实现摁两次返回键退出程序
- CodeForces 608A Saitama Destroys Hotel(水题)
- 单元测试练习