方式一、本地数据库匹配
应用网上的电话号归属地db数据进行匹配查询。
如若查不到可用此地址,包含3W+数据匹配。资源地址:https://download.csdn.net/download/lemon_husky/11942253
第一步:下载DB数据库资源放入APP得assets文件夹中,如下图所示:
第二步:通过代码将assets的数据库资源转移到app的数据库中:
//将assets文件夹的归属地数据库拷贝到本地数据库
public static void copyMobileNumberDb(){
File file = new File(MyApp.getAppContext().getFilesDir(),"mobileNumber.db");
if(file.exists()&&file.length()>0){
}else{
AssetManager am = MyApp.getAppContext().getAssets();
byte[] buffer = new byte[1024];
try {
InputStream is = am.open("mobileNumber.db");
FileOutputStream fis = new FileOutputStream(file);
int len = 0;
while((len=is.read(buffer))>0){
fis.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
第三步:生成一个实体类用于存放查询到的信息
public class MobileNumInfo {
private String name; //姓名
private String number; //电话号
private String belongPlace; //归属地
private String netName; //运营商
public String getBelongPlace() {
return belongPlace;
}
public void setBelongPlace(String belongPlace) {
this.belongPlace = belongPlace;
}
public String getNetName() {
return netName;
}
public void setNetName(String netName) {
this.netName = netName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
第四步:利用查询方法查询到我们需要的数据,如果有返回返回实体类。
//本地数据库路径
private static String path = "data/data/你的包名/files/mobileNumber.db";
//通过电话号码获取归属地
public static MobileNumInfo getAddress(String number) {
MobileNumInfo info = new MobileNumInfo();
info.setNumber(number);
String phoneNumber = info.getNumber().replace(" ", "");
File file = new File(path);
if (file.exists()) {
try {
if (phoneNumber.matches("^1[3456789]\\d{9}$")) {
String sql = "select * from Mobile where Mobile = ?";
SQLiteDatabase database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = database.rawQuery(sql, new String[]{phoneNumber.substring(0, 7)});
while (cursor.moveToNext()) {
String province = cursor.getString(cursor.getColumnIndex("Province"));
String city = cursor.getString(cursor.getColumnIndex("City"));
if (province.equals(city)) {
info.setBelongPlace(city);
} else {
info.setBelongPlace(province + " " + city);
}
info.setNetName(cursor.getString(cursor.getColumnIndex("Crop")).substring(2));
}
cursor.close();
database.close();
} else { //匹配不到归属地,显示未知号码
info.setBelongPlace("未知");
info.setNetName("");
}
}catch (Exception e){
info.setBelongPlace("未知");
info.setNetName("");
}
}
return info;
}
方式二、依赖谷歌libphonenumber库实现:
方法一:采用implementation引用依赖:
开源库地址:https://github.com/googlei18n/libphonenumber
//谷歌电话号码归属地库
implementation 'com.googlecode.libphonenumber:libphonenumber:8.10.3'
implementation 'com.googlecode.libphonenumber:carrier:1.99'
implementation 'com.googlecode.libphonenumber:geocoder:2.99'
implementation 'com.googlecode.libphonenumber:prefixmapper:2.109'
方法二:采用jar包引用依赖方式,下载链接中的jar包,carrier-1.99.jar,geocoder-2.99.jar,prefixmapper-2.99.jar,libphonenumber-8.9.9.jar
jar包下载地址:http://repo1.maven.org/maven2/com/googlecode/libphonenumber/
将下载好的jar包放在android项目中的libs文件夹中:
在build.gradle中添加如下代码:
dependencies {
implementation files('libs/carrier-1.99.jar')
implementation files('libs/geocoder-2.99.jar')
implementation files('libs/libphonenumber-8.9.9.jar')
implementation files('libs/prefixmapper-2.99.jar')
}
选择一个方式引用好依赖后实现查询归属地功能,功能代码如下:
public class MobileNumberUtils {
private static PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
private static PhoneNumberToCarrierMapper carrierMapper = PhoneNumberToCarrierMapper.getInstance();
private static PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();
private static String LANGUAGE ="CN";
//获取手机号码运营商
public static String getCarrier(Context context, String phoneNumber, int countryCode) {
Phonenumber.PhoneNumber referencePhonenumber = new Phonenumber.PhoneNumber();
try {
referencePhonenumber = phoneNumberUtil.parse(phoneNumber,LANGUAGE );
} catch (NumberParseException e) {
e.printStackTrace();
}
//返回结果只有英文,自己转成成中文
String carrierEn = carrierMapper.getNameForNumber(referencePhonenumber, Locale.ENGLISH);
String carrierZh = "";
if (countryCode == 86 && Locale.CHINA.getCountry().equals(Locale.getDefault().getCountry())) {
switch (carrierEn) {
case "China Mobile":
carrierZh += "中国移动";
break;
case "China Unicom":
carrierZh += "中国联通";
break;
case "China Telecom":
carrierZh += "中国电信";
break;
default:
break;
}
return carrierZh;
} else {
return carrierEn;
}
}
//获取手机号码归属地
public static String getGeo(String phoneNumber){
Phonenumber.PhoneNumber referencePhonenumber = null;
try {
referencePhonenumber = phoneNumberUtil.parse(phoneNumber, LANGUAGE);
} catch (NumberParseException e) {
e.printStackTrace();
}
//手机号码归属城市 referenceRegion
return geocoder.getDescriptionForNumber(referencePhonenumber, Locale.CHINA);
}
}