【问题标题】:Android Java Check if Contact has name or notAndroid Java 检查联系人是否有名字
【发布时间】:2021-04-22 09:54:33
【问题描述】:

我正在尝试通过 ContentResolver 查询获取电话联系方式。我可以获取联系人,但无法检查联系人是否有姓名。

我的情况是当联系人没有名字时,我会放一个空字符串,但ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME返回它的号码而不是null。

这是我获取联系人的代码

Cursor managedCursor = activity.getContentResolver()
                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        new String[]{ContactsContract.CommonDataKinds.Phone._ID,
                                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                                ContactsContract.CommonDataKinds.Phone.NUMBER},
                        "(" + ContactsContract.CommonDataKinds.Phone.NUMBER + " LIKE ? OR " + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " LIKE ?)"
                        , new String[]{"%" + keyword + "%", "%" + keyword + "%"}, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE");
        String firstChar = "";
        contacts.clear();
        while (managedCursor != null && managedCursor.moveToNext()) {
            String name = managedCursor.getString(managedCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phoneNumber = managedCursor.getString(managedCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

            // Cleanup the phone number
            phoneNumber = phoneNumber.replaceAll("[()\\s-]+", "");
            if (name.length() > 0) {
                String first = name.charAt(0) + "";
                if (!first.equalsIgnoreCase(firstChar)) {
                    firstChar = first + "";
                    contacts.add(new Contact(Contact.TYPE_HEADER, firstChar));
                }
            } else {

                //when name length is 0 or name is null, I want to replace it with empty string
                name = "";
                contacts.add(new Contact(Contact.TYPE_HEADER, "#"));
            }
            Contact contact = new Contact(phoneNumber, name);
            if (!contacts.contains(contact)) {
                contacts.add(contact);
            }
        }
        setupAdapter(contacts, keyword);
        if(managedCursor != null){
            managedCursor.close();
        }

我之前将它替换为空字符串的方法是将它的 phoneNumber 与 name 进行比较。如果它们相同,我将其替换为空字符串。但是当无名联系人有多个号码时,它无法检测到。

有没有人知道如何检测联系人是否有名字?

谢谢

【问题讨论】:

    标签: java android android-contacts


    【解决方案1】:

    我曾经使用过它。让我和你分享it(git repo)

    如果您想检查用户名是否可用。比,你写了if(name.isEmpty){}

    Cursor c;
        ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
        c=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,ContactsContract.Contacts.DISPLAY_NAME+" ASC ");
    
        while (c.moveToNext()){
            //get contact list
            String name=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String number=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    
            //put value into Hashmap
            HashMap<String, String> user_data = new HashMap<>();
            user_data.put(Constant.NAME, name);
            user_data.put(Constant.PHONE_NUMBER, number);
    
            list.add(user_data);
        }
    
    
    
        //  call the constructor of CustomAdapter to send the reference and data to Adapter
        CustomAdapterOfReadContacts customAdapter = new CustomAdapterOfReadContacts(HomeActivity.this,list);
        recyclerView.setAdapter(customAdapter); // set the Adapter to RecyclerView
    
        c.close();
    

    这样我获取数据并将其发送到适配器。以上源代码用于保存联系人列表。我正在为call list 提供一些源代码。

    public void getCallLogs() {            
        int flag=1;
        StringBuilder callLogs = new StringBuilder();
    
        ArrayList<String> calllogsBuffer = new ArrayList<String>();
        calllogsBuffer.clear();
        Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI,
                null, null, null, null);
        //cached name never deletes. If save it once to your contact. However you try to delete it. It won't delete from cached memory. I think if you `clear data` or `clear cache` than it will be deleted. I haven't try it.
        int name = managedCursor.getColumnIndex(CallLog.Calls.CACHED_NAME);
        int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
        int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
        int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
        int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
        while (managedCursor.moveToNext()) {
            String cacheName = managedCursor.getString(name);
            String phNumber = managedCursor.getString(number);
            String callType = managedCursor.getString(type);
            String callDate = managedCursor.getString(date);
            Date callDayTime = new Date(Long.valueOf(callDate));
            String callDuration = managedCursor.getString(duration);
            String dir = null;
            int dircode = Integer.parseInt(callType);
            switch (dircode) {
                case CallLog.Calls.OUTGOING_TYPE:
                    dir = "OUTGOING";
                    break;
                case CallLog.Calls.INCOMING_TYPE:
                    dir = "INCOMING";
                    break;
                case CallLog.Calls.MISSED_TYPE:
                    dir = "MISSED";
                    break;
            }
            calllogsBuffer.add("\nPhone Number: " + phNumber + " \nCall Type: "
                    + dir + " \nCall Date: " + callDayTime
                    + " \nCall duration in sec : " + callDuration + "\n");
    
        }
        managedCursor.close();
        }
    

    【讨论】:

    • 感谢回复,我试过了,通过断点调试检查每一步。当联系人没有姓名时,DISPLAY_NAME 返回电话号码而不是 null / 空字符串。我用小米红米 Note 5 (Custom ROM AOSP) 测试它。所以 isEmpty() 条件永远不会满足。
    • @Nauhalf 如果我成功帮助了您,您能否将其标记为答案?因为,其他人也很容易找到答案。 :)
    • 它不起作用:'(这是我调试时的屏幕截图,您可以看到名称与号码相同。imgur.com/TettjMM 但在联系人应用程序中我没有为其号码设置名称这里是屏幕截图详细联系方式imgur.com/n4TexTtimgur.com/WSiYHou
    • @Nauhalf 当你“打电话给”某人时看看。你得到他们的名字,但是,如果你不把号码保存为空。比它将显示为“”什么都没有。所以,你会得到错误。或者,用户会不高兴或犹豫。这就是为什么android将您的号码保存为名称的原因。所以,你做对了。
    • @Nauhalf 你不会得到别的东西。不管你怎么尝试。
    【解决方案2】:

    你需要同时查询Phone & StructuredName

    您可以通过直接查询Data 表来获取这两种DataType。

    Map<Long, List<String>> contacts = new HashMap<Long, List<String>>();
    
    String[] projection = {Data.CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3};
    String selection = Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "', '" + StructuredName.CONTENT_ITEM_TYPE + "')";
    Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);
    
    while (cur != null && cur.moveToNext()) {
        long id = cur.getLong(0);
        String name = cur.getString(1); // display name (can be phone or email if name is missing)
        String mime = cur.getString(2); // phone / structured-name
        String data1 = cur.getString(3); // will contain phone number if this is a phone row
        String data2 = cur.getString(4); // will contain first name if this is a name row
        String data3 = cur.getString(5); // will contain family name if this is a name row
    
        String kind = "unknown";
    
        // get an existing "contact" from our HashMap, or create a new one
        List<String> infos;
        if (contacts.containsKey(id)) {
            infos = contacts.get(id);
        } else {
            infos = new ArrayList<String>();
            infos.add("display-name = " + name);
            contacts.put(id, infos);
        }
    
        switch (mime) {
            case Phone.CONTENT_ITEM_TYPE: 
                kind = "phone"; 
                // add the phone to the contact
                infos.add(kind + " = " + data1);
                break;
            case StructuredName.CONTENT_ITEM_TYPE: 
                kind = "name";
                if (!TextUtils.isEmpty(data2) || !TextUtils.isEmpty(data3)) {
                    // found a real name! add it to the "contact"
                    infos.add(kind + " = " + data2 + " " + data3);
                }
                break;
        }
    
        Log.d(TAG, "got " + id + ", " + name + ", " + kind + " - " + data1 + " - " + data2 + " - " + data3 + " - " + hasName);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 2017-10-14
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多