6

Tôi phải tìm kiếm địa chỉ liên hệ dựa trên số điện thoại. Đây là mã hoạt động để tìm nạp địa chỉ liên hệ. Cấp API Android mà tôi đang sử dụng là 15Android: Tìm kiếm liên hệ dựa trên số điện thoại

 String[] projection = new String[] { 
       ContactsContract.CommonDataKinds.Phone._ID, 
       ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
       ContactsContract.CommonDataKinds.Phone.TYPE, 
       ContactsContract.CommonDataKinds.Phone.NUMBER}; 

     Cursor query = mContent.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, 
        ContactsContract.CommonDataKinds.Phone.NUMBER + " LIKE '%" + constraint.toString() + "%'" 
        ,null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 

Tôi có thể tìm nạp địa chỉ liên hệ không có chỗ trong số điện thoại được lưu trong bảng danh bạ. Nếu số điện thoại có khoảng cách giữa, truy vấn trên sẽ không thành công. Ví dụ: đối với một liên hệ, nếu số điện thoại được lưu dưới dạng 1234567890 và khi tôi đang tìm kiếm với giá trị 1234, thì liên hệ này sẽ được truy lục. Nhưng không thành công nếu số liên lạc được lưu thành "123 456 7890".

Dòng dưới cùng, khi tôi cố gắng tìm kiếm địa chỉ liên hệ có hoặc chứa "1234" với số điện thoại, kết quả sẽ trả lại cho tôi địa chỉ liên hệ có số điện thoại "1234567890" và "123 4567 890". Vì một số điện thoại Android tiết kiệm số điện thoại có khoảng cách giữa.

Làm cách nào để giải quyết vấn đề này. Bất kỳ trợ giúp được đánh giá cao.

+0

Thêm '%' giữa mỗi ký tự trong 'ràng buộc' của bạn sẽ là một tùy chọn – venkatKA

+2

Câu chuyện dài ngắn, để tìm kiếm theo số điện thoại, bạn cần sử dụng' ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER' chứa số điện thoại trong ' Định dạng E.164'. http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html#NORMALIZED_NUMBER –

+0

@SarwarErfan Rất tiếc, tôi không thể sử dụng hằng số này, cấp API mà tôi đang ở là 15. 'Liên hệContract.CommonDataKinds. Điện thoại.NORMALIZED_NUMBER' được thêm vào API 16. – User12111111

Trả lời

0

Hãy thử điều này:

public String getContactNameByNumber(String number) { 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    String name = "?"; 

    ContentResolver contentResolver = getContentResolver(); 
    Cursor contact = contentResolver.query(uri, new String[] {BaseColumns._ID, 
      ContactsContract.PhoneLookup.DISPLAY_NAME }, null, null, null); 

    try { 
     if (contact != null && contact.getCount() > 0) { 
      contact.moveToNext(); 
      name = contact.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
     } 
    } finally { 
     if (contact != null) { 
      contact.close(); 
     } 
    } 

    return name; 
} 
+0

Điều này có trả lại cho tôi một liên hệ có số điện thoại "123 456 7890", khi tôi đang tìm kiếm bằng "1234" không? Tôi đoán, điều này hoạt động khi chúng tôi nhập số điện thoại hoàn chỉnh. – User12111111

+0

có, nó hoạt động khi chúng tôi nhập số điện thoại hoàn chỉnh. –

+1

Vì vậy, với câu hỏi của tôi, câu trả lời này không hữu ích. cám ơn. – User12111111

-1

trong bạn code để thay đổi

constraint.toString() thay vì ghi constain.replaceAll ("", "");

rằng loại bỏ tất cả không gian từ chuỗi

+1

Để làm cho nó rõ ràng, tôi đang cố gắng để tìm kiếm địa chỉ liên lạc bắt đầu với "1234", kết quả sẽ trả lại cho tôi địa chỉ liên lạc với số điện thoại "1234567890" và "123 4567 890". Một số thiết bị Android tiết kiệm liên lạc với không gian. Làm thế nào tôi có thể lấy cả hai.? – User12111111

-1

thử điều này:

String whereName = ContactsContract.Data.MIMETYPE + " = ?"; 
String number; 
String[] whereNameParams = new String[] { ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }; 
Cursor nameCur = con.query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, ContactsContract.CommonDataKinds.Phone.NUMBER); 


while (nameCur.moveToNext()) { 
    number = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

    if (number != null) { 
     if (number.contains(num)) { 
      System.out.println(number); 

     } 
    } 

} 
nameCur.close(); 

Trong lên comment của câu trả lời nói rằng: "Tôi cố gắng để liên lạc mà bắt đầu với tìm kiếm '1234', kết quả nên trả lại cho tôi các số liên lạc có số điện thoại "1234567890" và "123 4567 890". "

Mã của tôi giải quyết vấn đề này.

+1

Xin chào, vui lòng thêm một số giải thích cho câu trả lời của bạn – User2012384

+0

bạn muốn giải thích lý do mã của bạn sẽ giải quyết câu hỏi op. –

Các vấn đề liên quan