java - Firebase:Android:如何显示安装了该应用程序的联系人列表

标签 java android firebase firebase-authentication

我正在通过 firebase 使用 Google 身份验证,并且正在成功登录用户。我还从电话簿(设备)中检索了联系人列表,并将其显示在我的应用程序 fragment 中的 ListView 上。但现在我希望向我的联系人中的用户显示安装了我的应用程序,这样,当单击时,他们将进入与他们的私有(private)聊天,其他联系人在单击时将使他们能够发送应用程序邀请。简而言之:我想查看设备上安装了该应用程序的联系人列表。

最佳答案

我通过三个简单的步骤实现了这一目标。

  • 获取您的手机联系人列表
  • 获取 Firestore 上所有电话号码的列表
  • 比较两个列表并返回共同元素。

为了使用我的方法,您需要在 Firestore 上有一个集合,其中包含所有用户的电话号码作为文档,如下图所示:

enter image description here

步骤如下:

第 1 步:我使用 ContentResolver 获取了所有用户联系人的列表。如果您已获得 READ_CONTACTS 权限,则可以使用以下方法检索此列表。

public ArrayList<String> getContacts(ContentResolver cr) {

    // list to be returned
    ArrayList<String> numbers = new ArrayList<>();

    // cursor
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

    if ((cur != null ? cur.getCount() : 0) > 0) {

        while (cur != null && cur.moveToNext()) {

            String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
            if (cur.getInt(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {

                Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
                while (pCur.moveToNext()) {
                    String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    Log.i(TAG, "Name: " + name);
                    numbers.add(formatRightWay(phoneNo));
                }

                pCur.close();
            }
          }
        }

        if(cur!=null){
            cur.close();
          }

        return numbers;
}

第 2 步:通过获取 user 集合的文档 ID,我获得了 Firestore 上所有电话号码的列表。这是一个快速实现:

firestore.collection("users").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
    if (task.isSuccessful()) {
        List<String> list = new ArrayList<>();
        for (QueryDocumentSnapshot document : task.getResult()) {
            list.add(document.getId());
        }
        // this is the list you need
        Log.d(TAG, list.toString());
    } else {
        Log.d(TAG, "Error getting documents: ", task.getException());
    }
  }
});

第 3 步:编写一个方法来比较两个列表并返回相似的元素。

public static ArrayList<String> shuffleBothLists(ArrayList<String> phoneContacts, List<String> firebaseContacts) {
    ArrayList<String> result = new ArrayList<>();

    for(String s: firebaseContacts) {
        if(phoneContacts.contains(s) && !result.contains(s)) {
            result.add(s);
        }
    }

    return result;
}

上述方法返回的列表是安装了该应用的联系人。

干杯!

关于java - Firebase:Android:如何显示安装了该应用程序的联系人列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45385663/

相关文章:

java - 如何为没有 build.xml 或 pom.xml 的项目构建 jar

java - 如何在没有文本框的情况下在 Selenium 中上传文件

javascript - 按钮点击动画

android - mediarecorder 类中是否有可用的暂停

swift - 如何使用来自 childByAutoID 的数据填充 tableView

java - 尝试使用 Apache POI 写入 excel 文件导致 OutOfMemoryError

java - 在锁定屏幕的情况下运行应用程序时,JobScheduler 作业无法启动

java - 根据当前位置Android从最近到最远对Java中的列表进行排序

git - 如何同时使用 Github 和 Firebase?

firebase - Flutter firebase 流重启崩溃