Android黑名單來電管理
阿新 • • 發佈:2019-02-11
public class BlocklistDbHelper extends SQLiteOpenHelper { private final static String TAG = "BlocklistDbHelper"; public static final String DATABASE_NAME = "blocklist.db"; public static final int DATABASE_VERSION = 1; public BlocklistDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION);} @Override public void onCreate(SQLiteDatabase db) { createBlocklistNumberTables(db);
createBlocklistCallLogTables(db);
...... }
private void createBlocklistNumberTables(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS blocklist(_id INTEGER PRIMARY KEY, number TEXT)"); }
private void createBlocklistCallLogTables(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS call_log (_ID INTEGER PRIMARY KEY,date INTEGER, number TEXT)"); }
在成功建立了資料庫之後,我們還需要一個內容提供者ContentProvider,為外界對資料庫進行增刪改查操作提供相關API。
public classBlocklistProvider extends ContentProvider { private final static String TAG = "BlocklistProvider"; private BlocklistDbHelper mDbHelper; private final static int URI_BLOCKLIST = 1;
private final static int URI_BLOCKLIST_CALL_LOG = 2;......
public final static String AUTHORITY = "com.android.blocklist"; private static final UriMatcher PMATCHER = new UriMatcher(UriMatcher.NO_MATCH); static { PMATCHER.addURI(AUTHORITY, "number", URI_BLOCKLIST);
PMATCHER.addURI(AUTHORITY, "call-log", URI_BLOCKLIST_CALL_LOG);...... }
在AndroidManafiest裡新增相關宣告。
<provider android:name="com.android.contacts.blocklist.data.BlocklistProvider" android:authorities="com.amigo.blocklist" android:exported="true" />
提供insert方法
@Override public Uri insert(Uri uri, ContentValues values) { Cursor c = null; long pid = 0; SQLiteDatabase db = mDbHelper.getWritableDatabase(); switch (PMATCHER.match(uri)) { case URI_BLOCKLIST: c = db.query("blocklist", null, number+ " = ?", new String[] { String.valueOf(values.get("number")) }, null, null, null); try { if (c != null && c.getCount() == 0) { pid = db.insert(blocklist, null, values); } } catch (Exception e) { } finally { if ((null != c) && !(c.isClosed())) { c.close(); } } return ContentUris.withAppendedId(uri, pid);
好了,下面我們就可以往資料庫裡新增黑名單了,方式也很簡單
Uri uri = Uri.parse("content://" + BlocklistProvider.AUTHORITY + "/number"); ContentValues insertValues = new ContentValues(1); insertValues.put("number", number); context.getContentResolver().insert(uri, insertValues);
現在我們已經成功往資料庫裡添加了黑名單,接下來如果黑名單資料庫裡的號碼在來電我們就要對它進行攔截。
上面提到了在響鈴時對通話進行攔截效果不好,那麼該在什麼地方攔截它呢。要知道在哪裡那麼就必須對Android來電流程有一定了解。Android的整個來電流程比較複雜,對於應用層來說,最早接收到framework分發的call訊息的在Telecomn的CallsManager處理,在這裡會對所註冊的一系列通話狀態進行處理,來電所對應的回撥方法是onSuccessfulIncomingCall,那麼在這裡處理是最為及時的。
@Override public void onSuccessfulIncomingCall(Call incomingCall) { Log.d(this, "onSuccessfulIncomingCall"); setCallState(incomingCall, CallState.RINGING, "successful incoming call");final String phoneNumber = getLogNumber(incomingCall);
//判斷來電號碼是否是黑名單 boolean isBlockNumber = mBlockListUtils.shouldBlockNumber(phoneNumber);if (isBlockNumber) {
//在這裡攔截它incomingCall.reject(false, null); mCallLogManager.logCall(incomingCall, Calls.INCOMING_TYPE);
//同時往黑名單資料庫裡新增一條包含號碼和來電時間的記錄
mBlockListUtils.addRejectCallLog(phoneNumber, incomingCall.getCreationTimeMillis());}
......
}
public void addRejectCallLog(String number, long date) {
Uri uri = Uri.parse("content://" + AUTHORITY + "/call-log"); ContentValues insertValues = new ContentValues(2); insertValues.put(“number”, number); insertValues.put("date", date); context.getContentResolver().insert(uri, insertValues);}
這樣我們就成功完成了對黑名單來電的攔截,同時也把該條通話記錄成功加入到了黑名單資料庫的通話記錄列表。接下來當用戶檢視通話記錄時,我們需要顯示那些是被成功攔截的通話記錄,這裡我們可以根據通話記錄的時間與黑名單資料庫裡通話記錄表裡的時間去進行匹配,如果匹配成功則為攔截的通話記錄。
至此對於黑名單的來電處理就介紹完畢了,實際開發中會對上面的功能進行擴充套件,原理大同小異,博主還要看會歐洲盃,因此就不在這裡一一敘述了。