在我的应用程序中,每个用户都使用电话号码登录。换句话说,每个用户名对应不同的号码。我想在某种程度上检测哪些手机通讯录正在使用此应用程序。但是,我无法确定我该怎么做。首先,我考虑查询每个联系人,并在最后使用OR
查询获取users_in_contacts。这个方法在this answer:
public void getFriends(List<String> numbers) {
List<ParseQuery<ParseUser>> queries = new ArrayList<ParseQuery<ParseUser>>();
for (String number : numbers) {
ParseQuery<ParseUser> parseQuery = ParseUser.getQuery();
parseQuery.whereEqualTo("username", number);
queries.add(parseQuery);
}
ParseQuery<ParseUser> userQuery = ParseQuery.or(queries);
userQuery.findInBackground(new FindCallback<ParseUser>() {
@Override
public void done(List<ParseUser> numberList, ParseException e) {
if (e == null) {
for (int i = 0; i < numberList.size(); i++) {
Log.v("" + i + ". user_contact", numberList.get(i).getUsername());
}
}
}
});
}
这是一个有效的解决方案,但我不想破解太多查询并超过每秒请求的限制。因此,我想知道是否有更好的选择。
简而言之,我怎样才能实现尽可能快速且无成本地(相对于每秒请求数)查找联系人中的用户?我会全神贯注于你的每一个建议和替代方法。提前谢谢。
答案 0 :(得分:1)
在Parse中有一个名为.whereContainedIn()的查询方法。通过使用此查询,我可以在不使用任何其他查询的情况下获取已在合同中的用户。我将所有合同(与电话号码相关联)作为此方法中的参数并且有效。我编写了一个AsyncTask来执行这些操作并在ListView中监视结果。如果你提出任何建议来提高这项任务的表现,我将不胜感激。
public class RetrieveContactedUsersTask extends AsyncTask<String, Void, String> {
private Activity activity;
HashMap<String, String> contactsMap = new HashMap<>();
String[] contactedUserNumbers;
ListView contactsView;
public RetrieveContactedUsersTask (Activity activity, ListView contactsView) {
this.activity = activity;
this.contactsView = contactsView;
}
@Override
protected String doInBackground(String... params) {
retrieveContactList();
return "Executed";
}
@Override
protected void onPostExecute(String result) {
TreeMap<String, String> contactedUsersMap = new TreeMap<>();
for (int i = 0; i < contactedUserNumbers.length; i++) {
contactedUsersMap.put(contactsMap.get(contactedUserNumbers[i]), contactedUserNumbers[i]);
}
contactsView.setAdapter(new ContactAdapter(activity, contactedUsersMap));
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(Void... values) {}
public void retrieveContactList() {
Cursor phones = null;
try {
phones = activity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (phones.moveToNext())
{
String _number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).replaceAll("\\s+", "");
String _name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
contactsMap.put(_number, _name);
}
phones.close();
} catch ( Exception e ) {}
finally {
if(phones != null){
phones.close();
}
}
try {
retrieveContactedUsers(contactsMap);
} catch (ParseException e) {
e.printStackTrace();
}
}
public void retrieveContactedUsers(Map<String, String> numbers) throws ParseException {
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.whereContainedIn("username", numbers.keySet());
List<ParseUser> users= query.find();
contactedUserNumbers = new String[users.size()];
for (int i = 0; i < users.size(); i++) {
String value = users.get(i).getUsername();
contactedUserNumbers[i] = value;
}
}
}