【问题标题】:Logical issue in list of numbers in the call log通话记录中号码列表中的逻辑问题
【发布时间】:2026-02-04 20:10:02
【问题描述】:

我的应用在通话记录中提供了一个号码列表。

不幸的是,我遇到了一个小问题。我的应用程序分别列出了下面的数字(即使它们是相同的数字)。有没有办法在我的应用程序中将其分组为一个数字? 我想为所有国家/地区的数字应用一种方法。

例子:

754-3010(本地)

(541) 754-3010(国内)

+1-541-754-3010(国际)

1-541-754-3010(在美国拨打)

001-541-754-3010(从德国拨打)

我的应用中的代码:

Cursor managedCursor = managedQuery( CallLog.Calls.CONTENT_URI,null, null,null, null);

int number = managedCursor.getColumnIndex( CallLog.Calls.NUMBER );

List<String> list = new ArrayList<>();

     while ( managedCursor.moveToNext() ) {
            String phNumber = managedCursor.getString( number );
            list.add(phNumber);
}

我在我的应用中显示list

【问题讨论】:

  • 是的,但如果您需要帮助,您需要提供更多背景信息。
  • 我只能看到一个国内电话号码 - 其他的都是通过添加不同的前缀衍生而来的。
  • @MaxZoom 完全正确。问题是在我的应用程序中,这些数字分别显示(好像它们不同)。我只想显示一个数字。例如显示(541) 754-3010
  • 看来你需要过滤没有国内字的行。但是上面列出的代码不允许提供具体的解决方案。
  • @bradimus 我编辑了这个问题。

标签: java


【解决方案1】:

我假设所有数字都属于美国

您需要在迭代时将列表中的所有数字转换为标准格式。

Set<String> numSet = new HashSet<String>();

while ( managedCursor.moveToNext() ) {
    String phNumber = managedCursor.getString( number );

    //Remove all non-numeric characters
    phNumber = phNumber.replaceAll("[^\\d]", "");

    //Remove all leading 0s
    phNumber = phNumber.replaceFirst("^0+(?!$)", "");

    //Remove "1" from the number if size is 11
    phNumber = phNumber.length() == 11 ? phNumber.substring(1,phNumber.length());

    //Format the number
    phNumber = phNumber.replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3");

    //Check if set already has the number, else put
    if(numSet.get(phNumber) == null) numSet.put(phNumber);
}

如果您的号码不限于美国,您需要编写逻辑来支持其他国家/地区。

参考this帖子,有类似要求。

【讨论】:

  • 不幸的是,我想要任何国家(不仅仅是美国)的号码代码。我很抱歉没有在我的问题中提到这一点(现已编辑)。
  • 你在这里得到的足够你自己制作了。投赞成票并尝试自己做一些事情。
  • 有没有办法处理来自任何国家的号码@Harshul?