Android libphonenumber Demo 手机号码归属地

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



你可能感兴趣的:(android,java)