ठीक है, खुदाई के बहुत सारे के बाद, मैंने पाया कि मैं क्या जवाब होना करने के लिए विश्वास करते हैं। आपके द्वारा उपयोग किए जाने वाले समाधानों के अनुसार आप किस एंड्रॉइड एपीआई स्तर का उपयोग कर रहे हैं। हालांकि, वे बिल्कुल सुंदर नहीं हैं, इसलिए यदि बेहतर समाधान हैं, तो मुझे जानना अच्छा लगेगा।
किसी भी मामले में, पहला कदम Intent.ACTION_PICK से लौटाई गई यूआरआई पर एक प्रश्न करके संपर्क की आईडी प्राप्त करना है। जब हम यहां हैं, हमें डिस्प्ले नाम भी प्राप्त करना चाहिए, और स्ट्रिंग का प्रतिनिधित्व करना चाहिए कि संपर्क में फ़ोन नंबर है या नहीं। (हम उन्हें आधुनिक समाधान के लिए की आवश्यकता होगी नहीं, लेकिन हम उन्हें विरासत समाधान के लिए की आवश्यकता होगी।)
String id, name, phone, hasPhone;
int idx;
Cursor cursor = getContentResolver().query(contactUri, null, null, null, null);
if (cursor.moveToFirst()) {
idx = cursor.getColumnIndex(ContactsContract.Contacts._ID);
id = cursor.getString(idx);
idx = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
name = cursor.getString(idx);
idx = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
hasPhone = cursor.getString(idx);
}
रिकॉर्ड के लिए, कॉलम इस URI से लौटे के सबसे क्षेत्रों स्थिरांक का प्रतिनिधित्व कर रहे ContactsContract.Profile कक्षा में (अन्य इंटरफेस से प्राप्त स्थिरांक सहित)। PHOTO_FILE_ID, PHOTO_THUMBNAIL_URI, या PHOTO_URI शामिल नहीं हैं (लेकिन PHOTO_ID शामिल है)।
अब हमारे पास आईडी है, हमें प्रासंगिक डेटा प्राप्त करने की आवश्यकता है। पहला (और सबसे सरल) समाधान एक इकाई से पूछताछ करना है। इकाई प्रश्न एक संपर्क या कच्चे संपर्क के लिए सभी संपर्क डेटा को एक बार में पुनर्प्राप्त करते हैं। प्रत्येक पंक्ति एक एकल कच्चे संपर्क का प्रतिनिधित्व करती है, जो ContactsContract.Contacts.Entity में स्थिरांक का उपयोग करके उपयोग की जाती है। आमतौर पर आप केवल RAW_CONTACT_ID, DATA1 और MIMETYPE से चिंतित होंगे। हालांकि, अगर आप पहले और आखिरी नाम अलग से चाहते हैं, तो नाम MIME प्रकार का पहला नाम DATA2 और DATA3 में अंतिम नाम होता है।
आप ContactsContract.CommonDataKinds स्थिरांक के साथ MIMETYPE कॉलम से मेल करके चर को लोड करते हैं; उदाहरण के लिए, ईमेल MIME प्रकार ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE में है।
// Build the Entity URI.
Uri.Builder b = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, id).buildUpon();
b.appendPath(ContactsContract.Contacts.Entity.CONTENT_DIRECTORY);
URI contactUri = b.build();
// Create the projection (SQL fields) and sort order.
String[] projection = {
ContactsContract.Contacts.Entity.RAW_CONTACT_ID,
ContactsContract.Contacts.Entity.DATA1,
ContactsContract.Contacts.Entity.MIMETYPE };
String sortOrder = ContactsContract.Contacts.Entity.RAW_CONTACT_ID + " ASC";
cursor = getContentResolver().query(contactUri, projection, null, null, sortOrder);
String mime;
int mimeIdx = cursor.getColumnIndex(ContactsContract.Contacts.Entity.MIMETYPE);
int dataIdx = cursor.getColumnIndex(ContactsContract.Contacts.Entity.DATA1);
if (cursor.moveToFirst()) {
do {
mime = cursor.getString(mimeIdx);
if (mime.equalsIgnoreCase(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
email = cursor.getString(dataIdx);
}
if (mime.equalsIgnoreCase(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
phone = cursor.getString(dataIdx);
}
// ...etc.
} while (cursor.moveToNext());
}
दुर्भाग्य से, संस्थाओं unti एपीआई 11 (Android 3.0, Honeycomb), जिसका अर्थ है इस कोड को बाजार में Android उपकरणों (इस लेखन के रूप में) का लगभग 65% के साथ असंगत है पेश नहीं किया गया। यदि आप इसे आजमाते हैं, तो आपको यूआरआई से IllegalArgumentException मिल जाएगा।
// Get phone number - if they have one
if ("1".equalsIgnoreCase(hasPhone)) {
cursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "+ id,
null, null);
if (cursor.moveToFirst()) {
colIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
phone = cursor.getString(colIdx);
}
cursor.close();
}
// Get email address
cursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + id,
null, null);
if (cursor.moveToFirst()) {
colIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS);
email = cursor.getString(colIdx);
}
cursor.close();
// ...etc.
जाहिर है, इस तरह से अलग डाटाबेस प्रश्नों का एक बहुत में परिणाम होगा, तो यह है:
दूसरा समाधान एक क्वेरी स्ट्रिंग का निर्माण, और प्रत्येक डेटा के लिए टाइप करें आप उपयोग करना चाहते एक क्वेरी बनाने के लिए है दक्षता कारणों के लिए अनुशंसित नहीं है।
try {
// Build the Entity URI.
Uri.Builder b = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, id).buildUpon();
b.appendPath(ContactsContract.Contacts.Entity.CONTENT_DIRECTORY);
// ...etc...
} catch (IllegalArgumentException e) {
// Get phone number - if they have one
if ("1".equalsIgnoreCase(hasPhone)) {
// ...etc...
} finally {
// If you want to display the info in GUI objects, put the code here
}
मुझे आशा है कि यह किसी को मदद मिलती है:
समाधान मैं ले कर आए हैं, संस्करण इकाई प्रश्नों का उपयोग करता है की कोशिश करने के IllegalArgumentException पकड़ने, और कैच ब्लॉक के अंदर विरासत कोड डाल है। और, फिर, अगर ऐसा करने के बेहतर तरीके हैं, तो मैं सभी कान हूं।
मुझे पैराम्स पर चेतावनी मिलती है [0] यह क्या है? –
आपके उत्तरों के लिए बहुत धन्यवाद! – Chisko
@ GerardGrundy कार्ल इस समाधान को एक AsyncTask के भीतर कार्यान्वित कर रहा है, जिसे सामग्री रिज़ॉल्वर से पूछताछ के संभावित लंबे समय तक चलने वाले संचालन के कारण अनुशंसा की जाती है।पैराम्स [] सरणी (जिसे आप चाहते हैं उसका नाम दिया जा सकता है, लेकिन "पैराम्स" और "तर्क" आम नाम हैं) यह है कि डेटा को AsyncTask में कैसे पारित किया जाता है। अधिक जानकारी के लिए [AsyncTask] (https://developer.android.com/reference/android/os/AsyncTask.html) दस्तावेज़ देखें। – Slerig