Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

एंड्रॉइड में कंटेंट प्रोवाइडर से फोन नंबर कैसे प्राप्त करें?

एंड्रॉइड में कंटेंट प्रोवाइडर से फोन नंबर प्राप्त करना

यह ट्यूटोरियल दिखाता है कि एंड्रॉइड ऐप में 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 एक्शन और लिगेसी कॉन्फिग हटा दिए गए।

ऐप चलाएं

  1. यूएसबी डिबगिंग सक्षम करके एक वास्तविक एंड्रॉइड डिवाइस कनेक्ट करें।
  2. एंड्रॉइड स्टूडियो में Run (▶) पर क्लिक करें और डिवाइस चुनें।
  3. ऐप परमिशन मांगेगा → Allow पर टैप करें।
  4. संपर्क सूची लोड होती है; किसी नाम पर टैप करके उसका नंबर टोस्ट में देखें।

आम समस्याएं

समस्यासमाधान
संपर्क सूची खाली हैसुनिश्चित करें कि डिवाइस में सहेजे गए संपर्क हैं और परमिशन दी गई है।
क्रैश SecurityException के साथमैनिफेस्ट में READ_CONTACTS घोषित करने और रनटाइम पर अनुरोध करने की दोबारा जांच करें।
इंडेक्स आउट ऑफ बाउंड्ससुनिश्चित करें कि contactNumbers में contactNames के समान आकार की प्रविष्टियां हैं (ऊपर दिया गया प्लेसहोल्डर तर्क इसे संभालता है)।

यह पैटर्न—परमिशन → क्वेरी → एडॉप्टर → क्लिक लिसनर—किसी भी ContactsContract डेटा (ईमेल, पते, आदि) के लिए काम करता है। संबंधित URI और कॉलम के लिए ContactsContract.CommonDataKinds देखें।

  1. Android में डिफ़ॉल्ट फोन नंबर कैसे प्राप्त करें? Android में डिफ़ॉल्ट फोन नंबर कैसे प्राप्त करें?

    Android में TelephonyManager का उपयोग करके फोन नंबर प्राप्त करें यह उदाहरण दर्शाता है कि Android में डिफ़ॉल्ट फोन नंबर (MSISDN) कैसे प्राप्त किया जाता है। ध्यान दें: यह सिम कार्ड पर संग्रहीत नंबर लौटाता है, जो हमेशा उपलब्ध नहीं होता। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project

  1. Android में ArrayBlockingQueue से हेड एलिमेंट कैसे प्राप्त करें? Android में ArrayBlockingQueue से हेड एलिमेंट कैसे प्राप्त करें?

    ArrayBlockingQueue में peek() से हेड एलिमेंट देखना ArrayBlockingQueue एक बाउंडेड, FIFO (फर्स्ट-इन-फर्स्ट-आउट) क्यू है जो ऐरे द्वारा समर्थित है। क्षमता निश्चित होती है। peek() हेड एलिमेंट रिटर्न करता है बिना हटाए। चरण 1: प्रोजेक्ट सेटअप Android Studio: File → New Project। चरण 2: लेआउट (activity_mai

  1. Android पर फ़ोन नंबर अनब्लॉक करने की चरण-दर-चरण गाइड Android पर फ़ोन नंबर अनब्लॉक करने की चरण-दर-चरण गाइड

    हम सभी के जीवन में कोई न कोई ऐसा व्यक्ति होता है जिसे हमने ब्लॉक किया हो। चाहे वह कोई अनजान अजनबी हो या पुराना परिचित जो बुरा बन गया हो। यह असामान्य नहीं है, और कॉन्टैक्ट्स ब्लॉक करने की क्षमता के लिए धन्यवाद, हम शांति से रह सकते हैं। जब आप Android पर किसी फ़ोन नंबर को ब्लॉक करते हैं, तो आपको उस नं