android開發如何獲取電話號碼的歸屬地資訊
由於本人在藍芽專案的開發中,需要在當撥打或接聽電話時彈出的通話介面中需要顯示其該號碼的歸屬地等資訊,所以今天決定將這個關於如何獲取手機號碼歸屬地的使用方法總結下來,以便將來所需,利人也利己。其實這個功能也是相當的常見,例如手機3G撥號時彈出的通話介面就有。
先上圖,再做邏輯分析:
思路分析,以後要拿來用的時候直接看這邊就好:
第一步:先做資料準備工作,如下
先用WriteToSD.java將telinfo.db寫入SD卡:
關鍵程式碼
public class WriteToSD {
private Context context;
String filePath = Environment.getExternalStorageDirectory() + "/bluetooth" ;
public WriteToSD(Context context) {
this.context = context;
if (!isExist()) {
write();
}
}
private void write() {
InputStream inputStream;
try {
inputStream = context.getResources().getAssets().open("telinfo.db", 3);
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
FileOutputStream fileOutputStream = new FileOutputStream(filePath + "/telinfo.db");
byte[] buffer = new byte[512];
int count = 0;
while ((count = inputStream.read(buffer)) > 0 ) {
fileOutputStream.write(buffer, 0, count);
}
fileOutputStream.flush();
fileOutputStream.close();
inputStream.close();
System.out.println("success");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private boolean isExist() {
File file = new File(filePath + "/telinfo.db");
if (file.exists()) {
return true;
} else {
return false;
}
}
再用PhoneCardInfoDBHelper.java拿到這個資料庫檔案進行訪問;我們先看看這個資料庫檔案裡面是什麼東西,如下
首先這個資料庫檔案放了很多張以首字母‘A’開頭和後面接3個數字的表,每張表裡面儲存的都是2個欄位,一個ID和一個int型別的整數字而已,有什麼作用就要去看看CityDefine.java這個類了
CityDefine.java關鍵程式碼,如下:
public PhoneCardInfo onLookupEvent(String strTelNumber) {
if (!TextUtils.isEmpty(strTelNumber)) {
PhoneCardInfo info = new PhoneCardInfo();
if (!checkAllNumber(strTelNumber)) {
return null;
}
if (strTelNumber.equals("13800138000")) {
info.mCityResID = 0;
info.mOperatorResID = R.string.phone_info_6;
return info;
} else if (strTelNumber.equals("1008611")) {
info.mCityResID = 0;
info.mOperatorResID = R.string.phone_info_7;
return info;
} else if (strTelNumber.equals("95105105")) {
info.mCityResID = 0;
info.mOperatorResID = R.string.phone_info_9;
return info;
}
if (strTelNumber.charAt(0) == '1' && strTelNumber.length() >= 7) {
int nCityID = 0;
String strOperatorID = strTelNumber.substring(0, 3);
System.out.println("strOperatorID - " + strOperatorID);
String strIndex = strTelNumber.substring(3, 7);
String strTableName = "A" + strOperatorID;
info.mCityResID = 0;
// 根據號碼的前3位,判斷是電信,聯通,移動或者聯通資料卡
info.mOperatorResID = findOperatorInfo(Integer.valueOf(strOperatorID));
System.out.println("mOperatorResID - " + info.mOperatorResID);
if (info.mOperatorResID != 0) {
System.out.println("strIndex_substring(3, 7) - " + strIndex);
// 根據號碼的前4-7位和資料表,判斷改號碼屬於的當前城市ID號
nCityID = readTelInfoFromDB(strTableName, Integer.valueOf(strIndex));
System.out.println("nCityID - " + nCityID);
if (nCityID != 0) {
// 根據城市ID號獲取該城市名稱
info.mCityResID = findCityInfo(nCityID);
System.out.println("info.mCityResID - " + info.mCityResID);
}
return info;
}
} else if (strTelNumber.charAt(0) == '1' && strTelNumber.length() == 5) {
info.mCityResID = 0;
info.mOperatorResID = findSpecialNumber(Integer.valueOf(strTelNumber));
return info;
} else if (strTelNumber.charAt(0) == '0' && strTelNumber.length() >= 3) {
String strIndex = new String();
if (strTelNumber.charAt(1) == '1' || strTelNumber.charAt(1) == '2') {
strIndex = strTelNumber.substring(1, 3);
} else if (strTelNumber.length() >= 4) {
strIndex = strTelNumber.substring(1, 4);
} else {
return null;
}
info.mCityResID = 0;
info.mOperatorResID = findAreaInfo(Integer.valueOf(strIndex));
return info;
}
}
return null;
}
由以上程式碼可見,資料庫每張表的表名數字部分就是要判斷的號碼的前3位數字,這邊是分情況而定,根據號碼的第一位和長度或者作特別號碼判斷,其中特別號碼為:比如13800,1008611等;那麼其它的我們普通使用者用的手機號碼一般為11位這邊都做了不同判斷處理,根據號碼的長度,然後根據號碼的不同段位來獲取該號碼是屬於電信,聯通,和移動的,再來就是根據號碼中間的幾位來判斷這個號碼是屬於哪個城市ID號進而在根據城市ID號得到該號碼屬於哪個城市,這個城市ID號和手機中的某個段位的號碼相互匹配,就在資料庫telinfo.db中各個表中,例如我這邊要查18899858039這個號碼,首先根據188可以查詢到該號碼是屬於移動的,程式碼如下:
private void initOperatorInfoMap() {
g_OperatorInfoMap = new SparseIntArray();
g_OperatorInfoMap.put(130, R.string.card_info_1);
g_OperatorInfoMap.put(131, R.string.card_info_1);
g_OperatorInfoMap.put(132, R.string.card_info_1);
g_OperatorInfoMap.put(133, R.string.card_info_3);
g_OperatorInfoMap.put(134, R.string.card_info_2);
g_OperatorInfoMap.put(135, R.string.card_info_2);
g_OperatorInfoMap.put(136, R.string.card_info_2);
g_OperatorInfoMap.put(137, R.string.card_info_2);
g_OperatorInfoMap.put(138, R.string.card_info_2);
g_OperatorInfoMap.put(139, R.string.card_info_2);
g_OperatorInfoMap.put(145, R.string.card_info_4);
g_OperatorInfoMap.put(147, R.string.card_info_2);
g_OperatorInfoMap.put(150, R.string.card_info_2);
g_OperatorInfoMap.put(151, R.string.card_info_2);
g_OperatorInfoMap.put(152, R.string.card_info_2);
g_OperatorInfoMap.put(153, R.string.card_info_3);
g_OperatorInfoMap.put(155, R.string.card_info_1);
g_OperatorInfoMap.put(156, R.string.card_info_1);
g_OperatorInfoMap.put(157, R.string.card_info_2);
g_OperatorInfoMap.put(158, R.string.card_info_2);
g_OperatorInfoMap.put(159, R.string.card_info_2);
g_OperatorInfoMap.put(180, R.string.card_info_3);
g_OperatorInfoMap.put(181, R.string.card_info_3);
g_OperatorInfoMap.put(182, R.string.card_info_2);
g_OperatorInfoMap.put(183, R.string.card_info_2);
g_OperatorInfoMap.put(184, R.string.card_info_2);
g_OperatorInfoMap.put(185, R.string.card_info_1);
g_OperatorInfoMap.put(186, R.string.card_info_1);
g_OperatorInfoMap.put(187, R.string.card_info_2);
g_OperatorInfoMap.put(188, R.string.card_info_2);
g_OperatorInfoMap.put(189, R.string.card_info_3);
}
這個資料在本地string.xml中已經作了匹配處理,然後根據188這三位即可去查資料表A188這張表所對應的ID號為’9986’的欄位所對應的值(由於cursor在查詢時候ID是從0開始數的所以這邊要+1)從而得出所屬城市