Skip to content

Instantly share code, notes, and snippets.

@unlocomqx
Created May 7, 2025 20:13

Revisions

  1. unlocomqx created this gist May 7, 2025.
    85 changes: 85 additions & 0 deletions contacts-picker.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,85 @@
    if (result.resultCode == Activity.RESULT_OK && result.data != null) {
    val uriList = mutableListOf<Uri>()
    if (result.data?.clipData != null) {
    for (i in 0 until result.data?.clipData?.itemCount!!) {
    uriList.add(result.data?.clipData?.getItemAt(i)?.uri!!)
    }
    } else {
    uriList.add(result.data?.data!!)
    }

    Log.i("ContactsManager", "contactUri: $uriList")

    if (uriList.isEmpty()) {
    val ret = JSObject()
    ret.put("error", "No contacts were picked")
    ret.put("data", "")
    invoke.resolve(ret)
    return
    }

    val queryFields = arrayOf(
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.Contacts.HAS_PHONE_NUMBER
    )
    val selection = String.format("%s > 0", ContactsContract.Contacts.HAS_PHONE_NUMBER)

    val contacts: MutableList<JSObject> = ArrayList()

    for (uri in uriList) {
    val cursor = activity.contentResolver
    .query(uri, queryFields, selection, null, null)
    try {
    if (cursor == null) {
    val ret = JSObject()
    ret.put("error", "No contacts were picked")
    ret.put("data", "")
    invoke.resolve(ret)
    return
    }

    Log.i("ContactsManager", "contacts: $contacts")
    while (cursor.moveToNext()) {
    val idIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID)
    val contactId = cursor.getString(idIndex)

    val phoneCursor: Cursor = activity.managedQuery(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    null,
    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId,
    null,
    null
    )

    while (phoneCursor.moveToNext()) {
    val phone = phoneCursor.getString(
    phoneCursor
    .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)
    )
    Log.i("ContactsManager", "phone: $phone")
    val contact = JSObject()
    contact.put("name", cursor.getString(1))
    contact.put("tel", phone)
    contacts.add(contact)
    }
    Log.i("ContactsManager", "name: $contactId")
    }
    } catch (e: Exception) {
    Log.e("ContactsManager", "Error: ${e.message}", e)
    val ret = JSObject()
    ret.put("error", "An error occurred while fetching contacts: ${e.message}")
    ret.put("data", "")
    invoke.resolve(ret)
    return
    } finally {
    cursor!!.close()
    }
    }

    val ret = JSObject()
    ret.put("error", "")
    ret.put("data", contacts)
    invoke.resolve(ret)
    return
    }