Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android 手機衛士7--黑名單攔截,android7--

Android 手機衛士7--黑名單攔截,android7--

編輯:關於android開發

Android 手機衛士7--黑名單攔截,android7--


1,黑名單數據庫創建

三個字段(_id 自增長字段 phone 黑名單號碼 mode 攔截類型)
創建表的sql語句
create table blacknumber (_id integer primary key autoincrement , phone varchar(20), mode varchar(5));
結合項目,去創建數據庫,以及相應的表

2.BlackNumberDao 

 BlackNumberDao單例模式

  1 package com.itheima.mobilesafe74.db.dao;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 import android.content.ContentValues;
  7 import android.content.Context;
  8 import android.database.Cursor;
  9 import android.database.sqlite.SQLiteDatabase;
 10 
 11 import com.itheima.mobilesafe74.db.BlackNumberOpenHelper;
 12 import com.itheima.mobilesafe74.db.domain.BlackNumberInfo;
 13 
 14 public class BlackNumberDao {
 15     private BlackNumberOpenHelper blackNumberOpenHelper;
 16     //BlackNumberDao單例模式
 17     //1,私有化構造方法
 18     private BlackNumberDao(Context context){
 19         //創建數據庫已經其表機構
 20         blackNumberOpenHelper = new BlackNumberOpenHelper(context);
 21     }
 22     //2,聲明一個當前類的對象
 23     private static BlackNumberDao blackNumberDao = null;
 24     //3,提供一個靜態方法,如果當前類的對象為空,創建一個新的
 25     public static BlackNumberDao getInstance(Context context){
 26         if(blackNumberDao == null){
 27             blackNumberDao = new BlackNumberDao(context);
 28         }
 29         return blackNumberDao;
 30     }
 31     
 32     /**增加一個條目
 33      * @param phone    攔截的電話號碼
 34      * @param mode    攔截類型(1:短信    2:電話    3:攔截所有(短信+電話))
 35      */
 36     public void insert(String phone,String mode){
 37         //1,開啟數據庫,准備做寫入操作
 38         SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase();
 39 
 40         ContentValues values = new ContentValues();
 41         values.put("phone", phone);
 42         values.put("mode", mode);
 43         db.insert("blacknumber", null, values);
 44         
 45         db.close();
 46     }
 47     
 48     /**從數據庫中刪除一條電話號碼
 49      * @param phone    刪除電話號碼
 50      */
 51     public void delete(String phone){
 52         SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase();
 53 
 54         db.delete("blacknumber", "phone = ?", new String[]{phone});
 55         
 56         db.close();
 57     }
 58     
 59     /**
 60      * 根據電話號碼去,更新攔截模式
 61      * @param phone    更新攔截模式的電話號碼
 62      * @param mode    要更新為的模式(1:短信    2:電話    3:攔截所有(短信+電話)
 63      */
 64     public void update(String phone,String mode){
 65         SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase();
 66 
 67         ContentValues contentValues = new ContentValues();
 68         contentValues.put("mode", mode);
 69         
 70         db.update("blacknumber", contentValues, "phone = ?", new String[]{phone});
 71         
 72         db.close();
 73     }
 74     
 75     /**
 76      * @return    查詢到數據庫中所有的號碼以及攔截類型所在的集合
 77      */
 78     public List<BlackNumberInfo> findAll(){
 79         SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase();
 80 
 81         Cursor cursor = db.query("blacknumber", new String[]{"phone","mode"}, null, null, null, null, "_id desc");
 82         List<BlackNumberInfo> blackNumberList = new ArrayList<BlackNumberInfo>();
 83         while(cursor.moveToNext()){
 84             BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
 85             blackNumberInfo.phone = cursor.getString(0);
 86             blackNumberInfo.mode = cursor.getString(1);
 87             blackNumberList.add(blackNumberInfo);
 88         }
 89         cursor.close();
 90         db.close();
 91         
 92         return blackNumberList;
 93     }
 94     
 95     /**
 96      * 每次查詢20條數據
 97      * @param index    查詢的索引值
 98      */
 99     public List<BlackNumberInfo> find(int index){
100         SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase();
101 
102         Cursor cursor = db.rawQuery("select phone,mode from blacknumber order by _id desc limit ?,20;", new String[]{index+""});
103         
104         List<BlackNumberInfo> blackNumberList = new ArrayList<BlackNumberInfo>();
105         while(cursor.moveToNext()){
106             BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
107             blackNumberInfo.phone = cursor.getString(0);
108             blackNumberInfo.mode = cursor.getString(1);
109             blackNumberList.add(blackNumberInfo);
110         }
111         cursor.close();
112         db.close();
113         
114         return blackNumberList;
115     }
116     
117     /**
118      * @return    數據庫中數據的總條目個數,返回0代表沒有數據或異常
119      */
120     public int getCount(){
121         SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase();
122         int count = 0;
123         Cursor cursor = db.rawQuery("select count(*) from blacknumber;", null);
124         if(cursor.moveToNext()){
125             count = cursor.getInt(0);
126         }
127         
128         cursor.close();
129         db.close();
130         return count;
131     }
132     
133     /**
134      * @param phone    作為查詢條件的電話號碼
135      * @return    傳入電話號碼的攔截模式    1:短信    2:電話    3:所有    0:沒有此條數據
136      */
137     public int getMode(String phone){
138         SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase();
139         int mode = 0;
140         Cursor cursor = db.query("blacknumber", new String[]{"mode"}, "phone = ?", new String[]{phone}, null, null,null);
141         if(cursor.moveToNext()){
142             mode = cursor.getInt(0);
143         }
144         
145         cursor.close();
146         db.close();
147         return mode;
148     }
149 }
BlackNumberDao

3,加載更多的觸發條件
1.監聽狀態改變
2.滾動到最底部,最後一個listView的條目可見
3.滾動狀態發生改變 滾動------>停止(空閒)

加載下一頁數據完成後,需要添加到上一頁數據的最後面 20 40 60 80 100

//監聽其滾動狀態
lv_blacknumber.setOnScrollListener(new OnScrollListener() {
	//滾動過程中,狀態發生改變調用方法()
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
//				OnScrollListener.SCROLL_STATE_FLING	飛速滾動
//				OnScrollListener.SCROLL_STATE_IDLE	 空閒狀態
//				OnScrollListener.SCROLL_STATE_TOUCH_SCROLL	拿手觸摸著去滾動狀態
		
		if(mBlackNumberList!=null){
			//條件一:滾動到停止狀態
			//條件二:最後一個條目可見(最後一個條目的索引值>=數據適配器中集合的總條目個數-1)
			if(scrollState == OnScrollListener.SCROLL_STATE_IDLE
					&& lv_blacknumber.getLastVisiblePosition()>=mBlackNumberList.size()-1
					&& !mIsLoad){
				/*mIsLoad防止重復加載的變量
				如果當前正在加載mIsLoad就會為true,本次加載完畢後,再將mIsLoad改為false
				如果下一次加載需要去做執行的時候,會判斷上訴mIsLoad變量,是否為false,如果為true,就需要等待上一次加載完成,將其值
				改為false後再去加載*/
				
				//如果條目總數大於集合大小的時,才可以去繼續加載更多
				if(mCount>mBlackNumberList.size()){
					//加載下一頁數據
					new Thread(){
						public void run() {
							//1,獲取操作黑名單數據庫的對象
							mDao = BlackNumberDao.getInstance(getApplicationContext());
							//2,查詢部分數據
							List<BlackNumberInfo> moreData = mDao.find(mBlackNumberList.size());
							//3,添加下一頁數據的過程
							mBlackNumberList.addAll(moreData);
							//4,通知數據適配器刷新
							mHandler.sendEmptyMessage(0);
						}
					}.start();
				}
			}
		}
		
	}
	
	//滾動過程中調用方法
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		
	}
});

4.攔截短信 

短信在接受的時候,廣播發送,監聽廣播接受者,攔截短信(有序)
將廣播的優先級級別提高到最高 (1000)

5.攔截電話

有電話撥入,處於響鈴狀態,響鈴狀態通過代碼去掛斷電話(aidl,反射),攔截電話
掛斷電話號碼的方法,放置在了aidl文件中名稱為endCall

在此處去查看TelePhoneManager源碼,去查找獲取ITelephony對象的方法

ServiceManager此類android對開發者隱藏,所以不能去直接調用其方法,所以需要反射調用
ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));

<uses-permission android:name="android.permission.CALL_PHONE"/>

//1,獲取ServiceManager字節碼文件
Class<?> clazz = Class.forName("android.os.ServiceManager");
//2,獲取方法
Method method = clazz.getMethod("getService", String.class);
//3,反射調用此方法
IBinder iBinder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);
//4,調用獲取aidl文件對象方法
ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);
//5,調用在aidl中隱藏的endCall方法
iTelephony.endCall();

  1 package com.itheima.mobilesafe74.service;
  2 
  3 import java.lang.reflect.InvocationTargetException;
  4 import java.lang.reflect.Method;
  5 
  6 import com.android.internal.telephony.ITelephony;
  7 import com.itheima.mobilesafe74.db.dao.BlackNumberDao;
  8 import com.itheima.mobilesafe74.service.AddressService.MyPhoneStateListener;
  9 import android.app.Service;
 10 import android.content.BroadcastReceiver;
 11 import android.content.Context;
 12 import android.content.Intent;
 13 import android.content.IntentFilter;
 14 import android.os.IBinder;
 15 import android.telephony.PhoneStateListener;
 16 import android.telephony.SmsMessage;
 17 import android.telephony.TelephonyManager;
 18 import android.util.Log;
 19 import android.view.WindowManager;
 20 
 21 public class BlackNumberService extends Service {
 22     private InnerSmsReceiver mInnerSmsReceiver;
 23     private BlackNumberDao mDao;
 24     private TelephonyManager mTM;
 25     private MyPhoneStateListener mPhoneStateListener;
 26     @Override
 27     public void onCreate() {
 28         mDao = BlackNumberDao.getInstance(getApplicationContext());
 29         
 30         //攔截短信
 31         IntentFilter intentFilter = new IntentFilter();
 32         intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
 33         intentFilter.setPriority(1000);
 34         
 35         mInnerSmsReceiver = new InnerSmsReceiver();
 36         registerReceiver(mInnerSmsReceiver, intentFilter);
 37         
 38         //監聽電話的狀態
 39         //1,電話管理者對象
 40         mTM = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
 41         //2,監聽電話狀態
 42         mPhoneStateListener = new MyPhoneStateListener();
 43         mTM.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
 44         
 45         super.onCreate();
 46     }
 47     
 48     class MyPhoneStateListener extends PhoneStateListener{
 49         //3,手動重寫,電話狀態發生改變會觸發的方法
 50         @Override
 51         public void onCallStateChanged(int state, String incomingNumber) {
 52             switch (state) {
 53             case TelephonyManager.CALL_STATE_IDLE:
 54                 break;
 55             case TelephonyManager.CALL_STATE_OFFHOOK:
 56                 break;
 57             case TelephonyManager.CALL_STATE_RINGING:
 58                 //掛斷電話     aidl文件中去了
 59 //                mTM.endCall();
 60                 endCall(incomingNumber);
 61                 break;
 62             }
 63             super.onCallStateChanged(state, incomingNumber);
 64         }
 65     }
 66     class InnerSmsReceiver extends BroadcastReceiver{
 67         @Override
 68         public void onReceive(Context context, Intent intent) {
 69             //獲取短信內容,獲取發送短信電話號碼,如果此電話號碼在黑名單中,並且攔截模式也為1(短信)或者3(所有),攔截短信
 70             //1,獲取短信內容
 71             Object[] objects = (Object[]) intent.getExtras().get("pdus");
 72             //2,循環遍歷短信過程
 73             for (Object object : objects) {
 74                 //3,獲取短信對象
 75                 SmsMessage sms = SmsMessage.createFromPdu((byte[])object);
 76                 //4,獲取短信對象的基本信息
 77                 String originatingAddress = sms.getOriginatingAddress();
 78                 String messageBody = sms.getMessageBody();
 79                 
 80                 int mode = mDao.getMode(originatingAddress);
 81                 
 82                 if(mode == 1 || mode == 3){
 83                     //攔截短信(android 4.4版本失效    短信數據庫,刪除)
 84                     abortBroadcast();
 85                 }
 86             }
 87         }
 88     }
 89     
 90     @Override
 91     public IBinder onBind(Intent arg0) {
 92         return null;
 93     }
 94     public void endCall(String phone) {
 95         int mode = mDao.getMode(phone);
 96         
 97         if(mode == 2 || mode == 3){
 98 //            ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
 99             //ServiceManager此類android對開發者隱藏,所以不能去直接調用其方法,需要反射調用
100             try {
101                 //1,獲取ServiceManager字節碼文件
102                 Class<?> clazz = Class.forName("android.os.ServiceManager");
103                 //2,獲取方法
104                 Method method = clazz.getMethod("getService", String.class);
105                 //3,反射調用此方法
106                 IBinder iBinder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);
107                 //4,調用獲取aidl文件對象方法
108                 ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);
109                 //5,調用在aidl中隱藏的endCall方法
110                 iTelephony.endCall();
111             } catch (Exception e) {
112                 e.printStackTrace();
113             }
114         }
115     }
116     @Override
117     public void onDestroy() {
118         if(mInnerSmsReceiver!=null){
119             unregisterReceiver(mInnerSmsReceiver);
120         }
121         super.onDestroy();
122     }
123 }
BlackNumberService

 

  

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved