我想要做的是搜索客户的地址簿(电话号码),只显示他们的电话号码是否已注册,只显示在firebase上注册的联系人。(有点像Whatsapp)
目前我正在firebase上显示所有注册用户
代码:
public class Tab1 extends Fragment {
private static final String TAG = "MyActivity";
private Button signOut;
private FirebaseAuth.AuthStateListener authListener;
private FirebaseAuth auth;
ListView listView;
private DatabaseReference mDatabase;
String userID;
ArrayList<String> userNames = new ArrayList<>();
ArrayList<String> uid = new ArrayList<>();
String receiverUID,receivername;
//Overriden method onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.tab1, container, false);
//get firebase auth instance
auth = FirebaseAuth.getInstance();
//get current user
final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
authListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user == null) {
// user auth state is changed - user is null
// launch login activity
startActivity(new Intent(getActivity(), LoginActivity.class));
getActivity().finish();
}
}
};
mDatabase = FirebaseDatabase.getInstance().getReference().child("users");
mDatabase.keepSynced(true);
listView = (ListView) v.findViewById(R.id.listview);
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//User user = dataSnapshot.getValue(User.class);
//Get map of users in datasnapshot
collectUserNames((Map<String, Object>) dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
//Error in Reaching Database
Log.d("TAB1","tab1 error");
}
} );
//Getting username from listview
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> a, View v, int position,
long id) {
String s =Integer.toString(position);
receiverUID = uid.get(position);
receivername = userNames.get(position);
Toast.makeText(getContext(),s , Toast.LENGTH_SHORT).show();
Log.v("log_tag", "List Item Click");
NewReminder();
}
});
//Returning the layout file after inflating
//Change R.layout.tab1 in you classes
return v;
}
private void collectUserNames(Map<String, Object> users) {
//iterate through each user, ignoring their UID
for (Map.Entry<String, Object> entry : users.entrySet()){
//Get user map
Map singleUser = (Map) entry.getValue();
//Getting UID of every user and adding to the Array
String Key = entry.getKey();
Log.d("KEy Value",Key);
//Removing the Current User's ID from the Display List
if(!Key.equals(userID)) {
uid.add(Key);
//Get usernames and append to list and array
userNames.add((String) singleUser.get("username"));
}
//Display all usernames
ArrayAdapter adapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, userNames);
listView.setAdapter(adapter);
}
}
查找我当前的Firebase数据库模型 Here
答案 0 :(得分:0)
首先,您必须从客户端设备获取所有联系人,
注意:您必须自己检查联系人权限,并且不要忘记添加权限清单。
在onCreate或检查权限后调用initData()。
这是从客户端设备获取联系人的代码。
private void initData() {
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,null);
while(Objects.requireNonNull(cursor).moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
// Finds the contact in our database through the Firebase Query to know whether that contact is using our app or not.
findUsers(number);
}
}
从客户端设备一个接一个地获取每个联系人的同时,我们将触发firebase查询,以检查该联系人是否正在使用我们的应用。
因此,我们正在使用“ findUser”方法来检查该联系人是否正在使用我们的应用程序。
private void findUsers(final String number){
Query query = FirebaseDatabase.getInstance().getReference()
.child("User")
.orderByChild("phone")
.equalTo(number);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.getValue() != null){
Map<String, Object> map = (Map<String, Object>) snapshot.getValue();
// this will print whole map of contacts who is using our app from clients contacts.
Log.d("ContactSync", snapshot.getValue().toString());
// so you can use any value from map to add it in your Recycler View.
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.d("ContactSync", error.getMessage());
}
});
}
感谢您阅读此答案, 希望对您有所帮助!