Firebase:Android:如何显示已安装应用的联系人列表

时间:2017-07-29 05:31:18

标签: java android firebase firebase-authentication

我正在通过firebase使用Google身份验证并成功记录用户。我还从电话簿(设备)中检索了联系人列表,并将其显示在我的应用程序中的片段中的列表视图中。但现在我希望在我的联系人中安装我的应用的用户中显示用户,这样点击时他们就会与他们进行私聊,其他联系人点击后会启用发送应用邀请。简而言之:我想查看在其设备上安装了应用程序的联系人列表。

5 个答案:

答案 0 :(得分:1)

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

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

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

enter image description here

以下是步骤:

步骤1:我通过使用ContentResolver获得了所有用户联系人的列表。如果您已授予import QtQml 2.12 as QtQml import QtQuick 2.12 as QtQuick import QtQuick.Controls 2.12 as QtQuickControls import QtQuick.Scene3D 2.0 import Qt3D.Core 2.0 import Qt3D.Render 2.0 import Qt3D.Input 2.0 import Qt3D.Extras 2.0 Scene3D { function change_translation_and_rotation() { parentTransform.translation.x = 0.1 parentTransform.translation.y = 0.5 parentTransform.translation.z = 2 parentTransform.rotationX = 30 parentTransform.rotationY = 60 parentTransform.rotationZ = 10 } function change_rotation_and_scale() { parentTransform.rotationX = 30 parentTransform.rotationY = 60 parentTransform.rotationZ = 10 parentTransform.scale3D.x = 0.1 parentTransform.scale3D.y = 0.5 parentTransform.scale3D.z = 2 } function reset_transform() { parentTransform.translation.x = -0.5 parentTransform.translation.y = 0 parentTransform.translation.z = 0.5 parentTransform.rotationX = 0 parentTransform.rotationY = 0 parentTransform.rotationZ = 0 parentTransform.scale3D.x = 1 parentTransform.scale3D.y = 1 parentTransform.scale3D.z = 1 } data: [ QtQml.Connections { target: parentTransform onMatrixChanged: { // cancel parent's transform var m = parentTransform.matrix var i = m.inverted() childTransform.matrix = i // debug: console.log(parentTransform.matrix.times(i)) } }, QtQuick.Column { spacing: 5 QtQuick.Repeater { id: buttons model: ["change_translation_and_rotation", "change_rotation_and_scale", "reset_transform"] delegate: QtQuickControls.Button { text: modelData.replace(/_/g, ' ') font.bold: focus onClicked: {focus = true; scene3d[modelData]()} } } } ] id: scene3d anchors.fill: parent aspects: ["render", "logic", "input"] Entity { id: root components: [RenderSettings {activeFrameGraph: ForwardRenderer {camera: mainCamera}}, InputSettings {}] Camera { id: mainCamera projectionType: CameraLens.PerspectiveProjection fieldOfView: 45 aspectRatio: 16/9 nearPlane : 0.1 farPlane : 1000.0 position: Qt.vector3d(-3.46902, 4.49373, -3.78577) upVector: Qt.vector3d(0.41477, 0.789346, 0.452641) viewCenter: Qt.vector3d(0.0, 0.5, 0.0) } OrbitCameraController { camera: mainCamera } Entity { id: parentEntity components: [ CuboidMesh { xExtent: 1 yExtent: 1 zExtent: 1 }, PhongMaterial { ambient: "#6cc" }, Transform { id: parentTransform translation: Qt.vector3d(-0.5, 0, 0.5) } ] Entity { id: childEntity components: [ CuboidMesh { xExtent: 0.5 yExtent: 0.5 zExtent: 0.5 }, PhongMaterial { ambient: "#c6c" }, Transform { id: childTransform translation: Qt.vector3d(-0.5, 0, 0.5) } ] } } QtQuick.Component.onCompleted: reset_transform() } } 权限,则可以使用以下方法检索此列表。

READ_CONTACTS

第2步:通过获取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; } 集合的文档ID,我在Firestore上获得了所有电话号码的列表。快速实现:

user

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

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());
    }
  }
});

上述方法返回的列表是您已安装应用程序的联系人。

干杯!

答案 1 :(得分:0)

无法直接列出联系人。您需要为firebase数据库中的用户创建一个节点,以便在注册后存储用户详细信息,然后您可以检索这些用户详细信息。

答案 2 :(得分:0)

我告诉你你正在使用firebase。现在,如果安装在某个设备中,您希望应用程序在firebase数据库中将所有联系人上传到您的服务器。

尝试以下代码:

public class YourActivity extends AppCompatActivity {

ProgressDialog dialog;
DatabaseReference yourReference;//your database reference

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    yourReference = FirebaseDatabase.getInstance().getReference().child("users");
    setContentView(R.layout.activity_your);
    dialog = new ProgressDialog(this);
    dialog.setMessage("Uploading contacts...");

// Query for contacts through content resolver. You will get a cursor.
    Cursor contacts = getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[]{
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.NUMBER
            },
            null,
            null,
            null
    );

// If you have a list as your data, firebase facilitates you to upload that easily by a single HashMap object. Create a HashMap object.

    HashMap<String,Object> map = new HashMap<>();

// Loop contacts cursor with map to put all contacts in map. I used contact name as key and number as its value (simple and pretty way).
    if(contacts!=null) {
        while(contacts.moveToNext()){
            map.put(
                    contacts.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)),
                    contacts.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
            );
        }
        contacts.close();
    }

    dialog.show();
//write map to firebase database reference...
    yourReference.updateChildren(map)
//this onSuccessListener is optional. You can terminate above line of code by ";" (semicolon).
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    dialog.dismiss();
                    Toast.makeText(YourActivity.this, "Contacts uploaded suffessfully!", Toast.LENGTH_SHORT).show();
                }
            })
//this onFailureListener is also optional.
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            dialog.dismiss();
            Log.w("MKN","Error: "+e.getMessage());
            Toast.makeText(YourActivity.this, "Contacts upload failed.", Toast.LENGTH_SHORT).show();
        }
    });
}
}

您需要提供READ_CONTACTS权限才能查询Contacts表。 同样在firebase规则中,&#34;写&#34;关键必须是&#34; true&#34;写入数据库。

答案 3 :(得分:0)

首先检索联系人列表..

    'ContentResolver cr = getContext().getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                Cursor cur1 = cr.query(
                        ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                        new String[]{id}, null);
                while (cur1.moveToNext()) {
                    //to get the contact names
                    HashMap<String, String> map = new HashMap<>();

                    String name=cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                    if( email != null ){
                        map.put("name", name);
                        map.put("email", email);
                        getContactList.add(map);
                    }
                }
                cur1.close();
            }
        }'

在此之后,您可以维护一个可以存储经过身份验证的用户信息的firebase数据库表,您可以将联系人与从firebase用户的数据库中提取的列表同步。

    'mapChat = new HashMap<>();
        Log.d("Debug", clist.toString());
        userReference1 = FirebaseDatabase.getInstance().getReference().child("Users");
        userReference1.keepSynced(true);
        userReference1.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (int x = 0; x < clist.size(); x++) {
                    //Log.d("Debug" ,list.get(x).get("email").toString());

                    for (DataSnapshot dsp : dataSnapshot.getChildren()) {

                        if (dsp.hasChild("email")) {

                            //    Log.d("Debug" , "setnewuser "  + dsp.child("email").getValue().toString());
                            if (dsp.child("email").getValue().toString().equals(clist.get(x).get("email").toString())) {
                                Log.d("Debug", "contact updated");
                                String uid = dsp.getKey().toString();
                                reference1 = FirebaseDatabase.getInstance().getReference().child("Users").child(id).child("contacts").child(uid);

                                mapChat.put("name", clist.get(x).get("name"));
                                mapChat.put("email", clist.get(x).get("email"));
                                mapChat.put("chats", "false");
                                reference1.setValue(mapChat);
                            }
                        }
                    }
                }
                reference1.onDisconnect();
                contactIdInterface1.contactUpdated();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });'

答案 4 :(得分:-1)

启用并实施firebase中的电话号码登录方法,这样你就可以从firebase中检索联系人并将其与本地联系人列表进行比较,之后便于实现你的逻辑