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



更多相关文章

  1. 实现图片的圆角,倒影,转换
  2. Android设置通知Notification
  3. Android(安卓)9.0 sdCard文件读写
  4. android第二天早:简单工具和布局基础
  5. Android培训班(73)Dex文件里类定义dvmDefineClass
  6. Android获取视频文件某一帧并设置图片
  7. Android文件储存
  8. Android(安卓)Sensor框架简述(三)
  9. android 图片处理工具类,Bitmap转换String ,Drawable, byte[],保存

随机推荐

  1. Android入门进阶教程(12)-SystemService
  2. Android面试-Android部分
  3. 《Android 复杂的列表视图新写法 MultiTy
  4. 【译】Kotlin Android扩展(Kotlin Android
  5. 探究Android异步消息的处理之Handler详解
  6. LinearLayout 线性布局管理器
  7. Android Manifest文件
  8. Android教程-Android 五大布局讲解与应用
  9. Android(安卓)Studio编译失败:More than o
  10. Android 慕课学习笔记整理(一)