Android libphonenumber Demo 手机号码归属地

来源:互联网 发布:欧亚科学院院士 知乎 编辑:程序博客网 时间:2024/05/24 06:50

libphonenumber 是google 开源的库,提供手机号码格式化,来电归属地,运营商等多种功能十分强大,现在做个简单的demo


1、首先下载 libphonumber 相关的库 here,  下载 carrier-1.9.jar、geocoder-2.32.jar、libphonenumber-7.2.2.jar、/prefixmapper-2.32.jar 这4个库。放在源码目录 lib 文件夹下(本人用的是 AS), 右键--> add as library 。


2、接下来就是怎样使用 其中的api了,下面是geo 工具类


public class GeoUtil {    private static PhoneNumberUtil mPhoneNumberUtil = PhoneNumberUtil.getInstance();    private static PhoneNumberToCarrierMapper carrierMapper = PhoneNumberToCarrierMapper.getInstance();    // 获取国家码 “CN”    public static String getCurrentCountryIso(Context context) {        // The {@link CountryDetector} should never return null so this is safe to return as-is.        return CountryDetector.getInstance(context).getCurrentCountryIso();    }    //获取归属地信息    public static String getGeocodedLocationFor(Context context,String phoneNumber) {        final PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();        Phonenumber.PhoneNumber structuredNumber = getStructedNumber(context,phoneNumber);        Locale locale = context.getResources().getConfiguration().locale;        return geocoder.getDescriptionForNumber(structuredNumber,locale);    }   //检查是否为 有效号码    public static boolean checkPhoneNumber(Context context,String phoneNumber) {        return mPhoneNumberUtil.isValidNumber(getStructedNumber(context,phoneNumber));    }    public static Phonenumber.PhoneNumber getStructedNumber(Context context,String phoneNumber) {        try {            final Phonenumber.PhoneNumber structuredNumber =                    mPhoneNumberUtil.parse(phoneNumber,getCurrentCountryIso(context));            return structuredNumber;        } catch (NumberParseException e) {            return  null;        }    }    //获取运营商信息    public static String getCarrier(Context context,String phoneNumber) {        Phonenumber.PhoneNumber structedNumber = getStructedNumber(context,phoneNumber);        Locale locale = context.getResources().getConfiguration().locale;        return carrierMapper.getNameForNumber(structedNumber,Locale.US);    }}



以下为获取国家码的工具类

public class CountryDetector {    private static final String TAG = CountryDetector.class.getSimpleName();    private static CountryDetector sInstance;    private final Context mContext;    private final TelephonyManager mTelephonyManager;    private final LocationManager mLocationManager;    private final LocaleProvider mLocaleProvider;    private final String DEFAULT_COUNTRY_ISO = "CN";    public static class LocaleProvider {        public Locale getDefaultLocale() {            return Locale.getDefault();        }    }    private CountryDetector(Context context) {        this(context,(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE),                (LocationManager) context.getSystemService(Context.LOCATION_SERVICE),                new LocaleProvider());    }    private CountryDetector(Context context, TelephonyManager telephonyManager,                            LocationManager locationManager, LocaleProvider localeProvider) {        mTelephonyManager = telephonyManager;        mLocationManager = locationManager;        mLocaleProvider = localeProvider;        mContext = context;    }    public  static CountryDetector getInstance(Context context) {        if(sInstance == null) {            sInstance = new CountryDetector(context);        }        return sInstance;    }    public String getCurrentCountryIso() {        String result = null;        if (isNetworkCountryCodeAvailable()) {            result = getNetworkBasedCountryIso();            Log.d(TAG," getNetworkBasedCountryIso");        }        if (TextUtils.isEmpty(result)) {            result = getSimBasedCountryIso();            Log.d(TAG,"getSimBasedCountryIso");        }        if (TextUtils.isEmpty(result)) {            result = getLocaleBasedCountryIso();            Log.d(TAG,"getLocaleBasedCountryIso");        }        if (TextUtils.isEmpty(result)) {            result = DEFAULT_COUNTRY_ISO;            Log.d(TAG,"DEFAULT_COUNTRY_ISO");        }        Log.d(TAG," result ==  " + result);        return result.toUpperCase(Locale.US);    }    /**     * @return the country code of the current telephony network the user is connected to.     */    private String getNetworkBasedCountryIso() {        return mTelephonyManager.getNetworkCountryIso();    }    /**     * @return the country code of the SIM card currently inserted in the device.     */    private String getSimBasedCountryIso() {        return mTelephonyManager.getSimCountryIso();    }    /**     * @return the country code of the user's currently selected locale.     */    private String getLocaleBasedCountryIso() {        Locale defaultLocale = mLocaleProvider.getDefaultLocale();        if (defaultLocale != null) {            return defaultLocale.getCountry();        }        return null;    }    private boolean isNetworkCountryCodeAvailable() {        // On CDMA TelephonyManager.getNetworkCountryIso() just returns the SIM's country code.        // In this case, we want to ignore the value returned and fallback to location instead.        return mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM;    }}


MainActivity


  protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                        .setAction("Action", null).show();            }        });        mEditNumber = (EditText) findViewById(R.id.number);        geocoder = PhoneNumberOfflineGeocoder.getInstance();        phoneNumberUtil = PhoneNumberUtil.getInstance();    }        public void submit(View v) {        phoneNumber = mEditNumber.getText().toString().trim();        boolean isValidnumber = GeoUtil.checkPhoneNumber(this,phoneNumber);        String carrier = GeoUtil.getCarrier(this,phoneNumber);        location = GeoUtil.getGeocodedLocationFor(this, phoneNumber);        Intent intent = new Intent(this,SecondActivity.class);        Bundle bundle = new Bundle();        bundle.putBoolean("ifValidNumber",isValidnumber);        bundle.putString("location", location);        bundle.putString("carrier",carrier);        intent.putExtras(bundle);        startActivity(intent);    }


4、

Github: https://github.com/googlei18n/libphonenumber


android source: http://androidxref.com/6.0.1_r10/xref/packages/apps/ContactsCommon/src/com/android/contacts/common/GeoUtil.java#34

网页版的demo:http://giggsey.com/libphonenumber/index.php



0 0