android获取手机号码的归属地以及运营商,本地查询

方式一、本地数据库匹配

应用网上的电话号归属地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);
    }
}

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值