Ich habe zwei Fragen:Wählen Sie den Benutzer für die Sortierreihenfolge aus, der unter Kontakte> Einstellungen in Android-Gerät ausgewählt ist.
1: Wie kann weiß, dass meine Anwendung Standardreihenfolge für die Sortierung native „Android Geräte-Kontakte“ verwendet Sortierung?
Inside „Kontakte“ -> „Einstellungen“ im Android haben wir „Liste von“ und „Anzeige Kontakte von“ Optionen. Wie kann ich diese Präferenzen in meiner Anwendung erhalten?
Zum Beispiel: Angenommen, Gerätekontakte werden nach "Vorname" sortiert, dann sollte die Anwendung eine Konstante erhalten (oder etwas Ähnliches). Auf der anderen Seite, wenn Kontakte nach "Nachname" sortiert sind, sollte die Anwendung Konstanten (oder Informationen) bezüglich derselben erhalten.
Ich suchte SO und ich habe diese link, aber das Problem ist, dass die Lösung in API-Ebene weiterentwickelt wurde.
Hier ist meine Abfrage zum Abrufen von Kontakten
String userPreference = getPrefContacts();/* **getPrefContacts() will return either ContactsContract.Data.DATA2 or ContactsContract.Data.DATA3** */
try {
ContentResolver cr = getActivity().getContentResolver();
String[] projectionName = new String[] {
ContactsContract.Data.CONTACT_ID,
ContactsContract.Data.DATA2, ContactsContract.Data.DATA5,
ContactsContract.Data.DATA3, ContactsContract.Data.DATA1 };
String sortOrder = userPrefrence
+ " COLLATE LOCALIZED ASC";
Cursor nameCursor = cr.query(ContactsContract.Data.CONTENT_URI,
projectionName, null, null, sortOrder);
nameCursor.moveToFirst();
if (nameCursor.getCount() > 0) {
do {
String fName = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA2));
String mName = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA5));
String lName = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA3));
String name = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA1));
if (name != null) {
String[] projectionCommon = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.HAS_PHONE_NUMBER };
String selectionCommon = ContactsContract.Contacts.DISPLAY_NAME
+ " = ?";
String[] selectionArgCommon = new String[] { name };
Cursor common = cr.query(
ContactsContract.Contacts.CONTENT_URI,
projectionCommon, selectionCommon,
selectionArgCommon, null);
if (common.getCount() > 0) {
while (common.moveToNext()) {
String contactID = common
.getString(common
.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
int hasPhone = common
.getInt(common
.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone > 0) {
String[] projectionPhone = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER };
String selectionPhone = ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?";
String[] selectionArgPhone = new String[] { contactID };
Cursor phoneCursor = cr
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projectionPhone,
selectionPhone,
selectionArgPhone, null);
if (phoneCursor.getCount() > 0) {
while (phoneCursor.moveToNext()) {
String phone = phoneCursor
.getString(phoneCursor
.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (phone != null) {
ContactData tmp = new ContactData(
name, fName, mName,
lName, phone, contactID);
if (raw.size() == 0) {
raw.add(tmp);
} else if (!(raw
.get(raw.size() - 1))
.getContactID()
.equalsIgnoreCase(
tmp.getContactID())) {
raw.add(tmp);
}
}
}
}
phoneCursor.close();
}
}
}
common.close();
}
} while (nameCursor.moveToNext());
nameCursor.close();
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
Ich brauche Code für getPrefContacts()Methode
2: Wie die Abfragezeit in Bezug auf obigen Code verbraucht reduzieren oder eine andere Möglichkeit?
Hoffe, dass jemand mir helfen kann.
Vielen Dank im Voraus.
Ja, Sie haben Recht mit dem Attribut ** join **. – Susomrof