如何从联系人中获取电话号码时移除国家代码

6

在此输入图片描述

我对该部分有疑问。如何从联系人列表中选择电话号码时删除国家代码?

例如:9999999999或+91 999999999而不是+020 9696854549或9696854549。请问有人知道如何解决这个问题吗?请给出解决方案。

我在这里附上我的代码和图片。

     private void contactPicked(Intent data) {
    Cursor cursor = null;
    try {
    String phoneNo = null ;
    // getData() method will have the Content Uri of the selected contact
    Uri uri = data.getData();
    //Query the content uri
    cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    // column index of the phone number
    int  phoneIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER
  phoneNo = cursor.getString(phoneIndex);
   String phoneNumber = phoneNo.replaceAll(" ","");
   mobile_et.setText(phoneNumber);
} catch (Exception e) {
    e.printStackTrace();
}
}

@IntelliJAmiya 这只适用于国家代码有三位数字的国家。美国是1,许多国家是2... - Peter Abolins
1
并没有规定所有电话号码(在联系人列表中)都必须有国家代码。但是,您可以通过查找“+”并删除其后的数字(直到第一个空格)来检查这一点。 - Peter Abolins
10个回答

4

试试这个...

                if(number.length()>10)
                {
                    int startidx=number.length()-10;
                    String getnumber=number.substring(startidx,number.length());
                    etEmerNumber.setText(getnumber);
                }
                else
                {
                    etEmerNumber.setText(number);
                }

4

我的英语不太好,但我会尽力回答你的问题。

首先,在您的build.gradle文件中添加此行:

compile 'com.googlecode.libphonenumber:libphonenumber:8.7.0'

以下是用 Kotlin 编写的示例代码:
fun deleteCountry(phone: String) : String{
    val phoneInstance = PhoneNumberUtil.getInstance()
    try {
        val phoneNumber = phoneInstance.parse(phone, null)
        return phoneNumber?.nationalNumber?.toString()?:phone
    }catch (_ : Exception) {
    }
    return phone
}

如果电话号码不是以'+'和国家区号开头,那么您应该提供地区信息,例如:

val phoneNumber = phoneInstance.parse(phone, "CN")


更新Android项目使用以下代码:implementation 'io.michaelrocks:libphonenumber-android:8.12.52' - Ankit Gupta
@AnkitGupta 你为什么认为我们应该在Android实现中使用'io.michaelrocks:libphonenumber-android:8.12.52'而不是com.googlecode.libphonenumber:libphonenumber:8.7.0? - Jay Rathod

4

你可以使用 startsWith() 方法。

此方法有两个变体,用于测试字符串是否以指定的前缀开头,可以从指定索引开始或默认从开头开始。

if(phoneNumber.startsWith("+"))
{
    if(phoneNumber.length()==13)
    {
    String str_getMOBILE=phoneNumber.substring(3);
    mobile_et.setText(str_getMOBILE);
    }
    else if(phoneNumber.length()==14)
    {
    String str_getMOBILE=phoneNumber.substring(4);
    mobile_et.setText(str_getMOBILE);
    }


}
else
{
 mobile_et.setText(phoneNumber);
}

1
谢谢。但是您的解决方案是去掉前四位数字。我从您的答案中得到了这个解决方案,例如:+917854129856,它会给出54129856。当我提问时,这不是完美的解决方案。我需要得到7854129845。 - New

3

我只是简单地扩展了这个答案,如果你不想使用任何库,那么可以按照以下方式完成。为了匹配任何前缀,并且由于某些国家可能共享部分相同的前缀(例如91和91-721),您可以按降序和大小将所有可能性添加到正则表达式中。

按照以下代码进行操作:

public static String PhoneNumberWithoutCountryCode(String phoneNumberWithCountryCode){//+91 7698989898
        Pattern compile = Pattern.compile("\\+(?:998|996|995|994|993|992|977|976|975|974|973|972|971|970|968|967|966|965|964|963|962|961|960|886|880|856|855|853|852|850|692|691|690|689|688|687|686|685|683|682|681|680|679|678|677|676|675|674|673|672|670|599|598|597|595|593|592|591|590|509|508|507|506|505|504|503|502|501|500|423|421|420|389|387|386|385|383|382|381|380|379|378|377|376|375|374|373|372|371|370|359|358|357|356|355|354|353|352|351|350|299|298|297|291|290|269|268|267|266|265|264|263|262|261|260|258|257|256|255|254|253|252|251|250|249|248|246|245|244|243|242|241|240|239|238|237|236|235|234|233|232|231|230|229|228|227|226|225|224|223|222|221|220|218|216|213|212|211|98|95|94|93|92|91|90|86|84|82|81|66|65|64|63|62|61|60|58|57|56|55|54|53|52|51|49|48|47|46|45|44\\D?1624|44\\D?1534|44\\D?1481|44|43|41|40|39|36|34|33|32|31|30|27|20|7|1\\D?939|1\\D?876|1\\D?869|1\\D?868|1\\D?849|1\\D?829|1\\D?809|1\\D?787|1\\D?784|1\\D?767|1\\D?758|1\\D?721|1\\D?684|1\\D?671|1\\D?670|1\\D?664|1\\D?649|1\\D?473|1\\D?441|1\\D?345|1\\D?340|1\\D?284|1\\D?268|1\\D?264|1\\D?246|1\\D?242|1)\\D?");
        String number = phoneNumberWithCountryCode.replaceAll(compile.pattern(), "");
        //Log.e(tag, "number::_>" +  number);//OutPut::7698989898
        return number;
    }

2
如果您可以使用库,这可能会对您有所帮助:
Gradle:
repositories {
  mavenCentral()
}

dependencies {
  implementation 'io.michaelrocks:libphonenumber-android:8.12.51'
}

Java:

String getPhoneNummberWithoutCountryCode(String phoneNo)
{
    PhoneNumberUtil phoneInstance = PhoneNumberUtil.createInstance(this.getContext());
    
    Phonenumber.PhoneNumber phoneNumber = phoneInstance.parse(phoneNo, null);
    String nationalSignificantNumber = phoneInstance.getNationalSignificantNumber(phoneNumber);

    return nationalSignificantNumber;
}

nationalSignificantNumber 是必需的电话号码。


2
它适用于所有实例。您无需担心国家代码有多少位数字
String get_Mo = phoneNumber.substring(phoneNumber.lastIndexOf(' ')+1));

0
首先,确保您提供的电话号码应该是标准化格式,例如:

+921234567

然后使用Google的libphonenumber库,在build.gradle中添加以下代码:

implementation 'com.googlecode.libphonenumber:libphonenumber:8.13.4'

然后按照以下代码操作:
val phoneUtil = PhoneNumberUtil.getInstance()
                try {
                    val phoneNumberProto: Phonenumber.PhoneNumber = phoneUtil.parse(number, null)
                    val numberWithoutCountryCode = phoneUtil.getNationalSignificantNumber(phoneNumberProto)
                    Log.d(Constant.LOG_APP_DEBUG, "PhoneNumber: $numberWithoutCountryCode")
                } catch (e: NumberParseException) {
                    Log.d(Constant.LOG_APP_DEBUG, "NumberParseException was thrown: $e")
                }

0
String Trimmed = s.toString().trim();
if(Trimmed.length() > 10){
char[] number = Trimmed.toCharArray();
int extra;
int dif = Trimmed.length() - 10 ;
for(int i = dif; i < Trimmed.length() ; i++){
    extra = i-dif;
    number[extra] = number[i];
}
for (int i = 10 ; i < Trimmed.length() ; i++){
    number[i]=' ';
}
String finalNumber = String.valueOf(number);
MobileNumberET.setText(finalNumber.trim());
}

//将此粘贴到您的文本更改监听器中


欢迎来到Stack Overflow!虽然这段代码片段可能解决了问题,但它并没有解释为什么或者如何回答这个问题。请在您的代码中包含解释,因为这真的有助于提高您的帖子质量。记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议的原因。 - Samuel Philipp

0

使用这个函数,希望它能帮到你:

public String phoeNumberWithOutCountryCode(String phoneNumberWithCountryCode) {
        Pattern complie = Pattern.compile(" ");
        String[] phonenUmber = complie.split(phoneNumberWithCountryCode);
        Log.e("number is", phonenUmber[1]);
        return phonenUmber[1];
    }

我有一个电话号码,格式为+911234567890,我需要去掉+91代码。另外,如果我的号码是+91 1234 4567 - 897,使用上述代码后只能得到1234这个数字,但我需要得到12344567897这样的格式。 - Lahari Areti

0
使用一个库 https://groups.google.com/forum/?hl=zh-CN&fromgroups#!forum/libphonenumber-discuss
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
// phone must begin with '+'
PhoneNumber numberProto = phoneUtil.parse(phone, "");
int countryCode = numberProto.getCountryCode();
} catch (NumberParseException e) {
System.err.println("NumberParseException was thrown: " + e.toString());
}

如果您想在移动设备上对特定的Sim卡执行一些额外的功能,可以使用以下许多方法之一。 可能不是完美的解决方案,但我会尽力而为。 首先,在程序中获取国家代码:

TelephonyManager tm = (TelephonyManager) 
this.getSystemService(Context.TELEPHONY_SERVICE);
//get the country iso from sim e.g US, NG, FR etc
String countryIso = tm.getSimCountryIso().toUpperCase():
//get countrycode from refegion returns the code e.g +123, +1, +23 etc. 
Int countryCode = 
phoneNumberUtil.getInstance().getCountryCodeForRegion(countryIso);

然后,您可以使用您喜欢的方式将其删除,例如:String PhoneNumber = phoneNo.replaceAll("countryCode ", "");

还有其他答案可以回答提问者的问题,而且它们是一段时间之前发布的。当您发布答案时,请确保添加一个新的解决方案或更加详细的解释,特别是在回答旧问题时。参见:如何撰写好的答案? - help-info.de

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接