एंड्रॉइड में कंटेंट प्रोवाइडर से फोन नंबर प्राप्त करना
यह ट्यूटोरियल दिखाता है कि एंड्रॉइड ऐप में ContactsContract कंटेंट प्रोवाइडर का उपयोग करके डिवाइस के संपर्कों से फोन नंबर कैसे प्राप्त करें। हम READ_CONTACTS रनटाइम परमिशन को संभालेंगे, संपर्कों को क्वेरी करेंगे, और उन्हें एक ListView में प्रदर्शित करेंगे। किसी संपर्क पर टैप करने पर उसका फोन नंबर टोस्ट में दिखाई देगा।
आवश्यकताएं
- एंड्रॉइड स्टूडियो (कोई भी हालिया संस्करण)
- न्यूनतम SDK: API 21 (लॉलीपॉप) या उच्चतर
- टेस्टिंग के लिए एक वास्तविक डिवाइस (क्योंकि एमुलेटर में डिफ़ॉल्ट रूप से संपर्क नहीं होते)
चरण 1 - नया प्रोजेक्ट बनाएं
एंड्रॉइड स्टूडियो खोलें → File > New > New Project → Empty Activity चुनें → पैकेज नाम दर्ज करें (उदाहरण: com.example.contactphone) → Finish पर क्लिक करें।
चरण 2 - लेआउट डिज़ाइन करें (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">
<ListView
android:id="@+id/contactList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp" />
</LinearLayout>
नोट: मूल उदाहरण में ListView पर गलत android:text और android:textSize विशेषताएं थीं; उन्हें हटा दिया गया है क्योंकि ListView सीधे टेक्स्ट प्रदर्शित नहीं करता है।
चरण 3 - मैनिफेस्ट में परमिशन जोड़ें (AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.contactphone">
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ContactPhone">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
चरण 4 - मुख्य गतिविधि लागू करें (MainActivity.java)
package com.example.contactphone;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_REQUEST_READ_CONTACTS = 100;
private ListView contactListView;
private ArrayAdapter adapter;
private final List contactNames = new ArrayList<>();
private final List contactNumbers = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactListView = findViewById(R.id.contactList);
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, contactNames);
contactListView.setAdapter(adapter);
contactListView.setOnItemClickListener((parent, view, position, id) -> {
String number = contactNumbers.get(position);
Toast.makeText(this, "नंबर: " + number, Toast.LENGTH_LONG).show();
});
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
== PackageManager.PERMISSION_GRANTED) {
loadContacts();
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS},
PERMISSION_REQUEST_READ_CONTACTS);
}
}
@SuppressLint("Range")
private void loadContacts() {
contactNames.clear();
contactNumbers.clear();
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(
ContactsContract.Contacts.CONTENT_URI,
null, null, null,
ContactsContract.Contacts.DISPLAY_NAME + " ASC");
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
contactNames.add(name);
int hasPhone = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone > 0) {
Cursor phoneCursor = resolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{id},
null);
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
String phone = phoneCursor.getString(
phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactNumbers.add(phone);
}
phoneCursor.close();
}
} else {
// प्लेसहोल्डर ताकि इंडेक्स नामों के साथ संरेखित रहें
contactNumbers.add("उपलब्ध नहीं");
}
}
cursor.close();
}
adapter.notifyDataSetChanged();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_READ_CONTACTS) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
loadContacts();
} else {
Toast.makeText(this, "संपर्क पढ़ने के लिए परमिशन आवश्यक है", Toast.LENGTH_LONG).show();
}
}
}
}
मुख्य सुधार
- आधुनिक API:
androidxलाइब्रेरी,ContextCompat/ActivityCompat, और लैंब्डा लिसनर का उपयोग करता है। - सुरक्षित कर्सर हैंडलिंग:
@SuppressLint("Range")के साथ उचित नल-चेक और कॉलम इंडेक्स लुकअप। - सिंक्रनाइज़्ड सूचियाँ: जब किसी संपर्क के पास फोन नंबर नहीं होता तो एक प्लेसहोल्डर ("उपलब्ध नहीं") जोड़ता है, इसलिए नाम/नंबर इंडेक्स हमेशा मेल खाते हैं।
- सॉर्ट ऑर्डर: संपर्क वर्णानुक्रम में दिखाई देते हैं।
- साफ मैनिफेस्ट: अनावश्यक
CREATE_SHORTCUTएक्शन और लिगेसी कॉन्फिग हटा दिए गए।
ऐप चलाएं
- यूएसबी डिबगिंग सक्षम करके एक वास्तविक एंड्रॉइड डिवाइस कनेक्ट करें।
- एंड्रॉइड स्टूडियो में Run (▶) पर क्लिक करें और डिवाइस चुनें।
- ऐप परमिशन मांगेगा → Allow पर टैप करें।
- संपर्क सूची लोड होती है; किसी नाम पर टैप करके उसका नंबर टोस्ट में देखें।
आम समस्याएं
| समस्या | समाधान |
|---|---|
| संपर्क सूची खाली है | सुनिश्चित करें कि डिवाइस में सहेजे गए संपर्क हैं और परमिशन दी गई है। |
क्रैश SecurityException के साथ | मैनिफेस्ट में READ_CONTACTS घोषित करने और रनटाइम पर अनुरोध करने की दोबारा जांच करें। |
| इंडेक्स आउट ऑफ बाउंड्स | सुनिश्चित करें कि contactNumbers में contactNames के समान आकार की प्रविष्टियां हैं (ऊपर दिया गया प्लेसहोल्डर तर्क इसे संभालता है)। |
यह पैटर्न—परमिशन → क्वेरी → एडॉप्टर → क्लिक लिसनर—किसी भी ContactsContract डेटा (ईमेल, पते, आदि) के लिए काम करता है। संबंधित URI और कॉलम के लिए ContactsContract.CommonDataKinds देखें।