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

एंड्रॉइड डिवाइस में कॉल्स कैसे डिटेक्ट करें?

एंड्रॉइड में फोन स्टेट मॉनिटरिंग (कॉल डिटेक्शन)

यह गाइड BroadcastReceiver और TelephonyManager का उपयोग करके इनकमिंग/आउटगोइंग कॉल्स डिटेक्ट करने का तरीका दिखाता है।

आवश्यक अनुमतियाँ

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- एंड्रॉइड 10+ के लिए फोरग्राउंड सर्विस की आवश्यकता हो सकती है -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" />

लेआउट (activity_main.xml)

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="24dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="कॉल डिटेक्शन सक्रिय"
        android:textSize="24sp"
        android:textStyle="bold"
        android:textColor="@color/colorPrimary" />
</RelativeLayout>

CallReceiver.java - ब्रॉडकास्ट रिसीवर

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class CallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        
        if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) {
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

            switch (state) {
                case TelephonyManager.EXTRA_STATE_RINGING:
                    // इनकमिंग कॉल बज रही है
                    String msg = "इनकमिंग कॉल: " + (incomingNumber != null ? incomingNumber : "अज्ञात");
                    Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
                    logCallEvent(context, "RINGING", incomingNumber);
                    break;
                    
                case TelephonyManager.EXTRA_STATE_OFFHOOK:
                    // कॉल एक्टिव (आउटगोइंग या उत्तर दिया गया)
                    Toast.makeText(context, "कॉल एक्टिव", Toast.LENGTH_SHORT).show();
                    logCallEvent(context, "OFFHOOK", incomingNumber);
                    break;
                    
                case TelephonyManager.EXTRA_STATE_IDLE:
                    // कॉल समाप्त / इंतजार
                    Toast.makeText(context, "कॉल समाप्त", Toast.LENGTH_SHORT).show();
                    logCallEvent(context, "IDLE", incomingNumber);
                    break;
            }
        }
    }

    private void logCallEvent(Context context, String state, String number) {
        // यहां लॉगिंग/डेटाबेस/सर्वर सिंक लागू करें
        android.util.Log.d("CallDetector", "स्टेट: " + state + ", नंबर: " + number);
    }
}

MainActivity.java - अनुमति अनुरोध

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQUEST_CODE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        requestPhoneStatePermission();
    }

    private void requestPhoneStatePermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) 
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_PHONE_STATE},
                PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "कॉल डिटेक्शन सक्षम", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "फोन स्टेट अनुमति आवश्यक है", Toast.LENGTH_LONG).show();
            }
        }
    }
}

AndroidManifest.xml में रिसीवर रजिस्टर करें

<application ...>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver 
        android:name=".CallReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>
</application>

एंड्रॉइड 10+ (API 29+) के लिए महत्वपूर्ण बदलाव

⚠️ एंड्रॉइड 10+ प्रतिबंध: बैकग्राउंड में PHONE_STATE ब्रॉडकास्ट प्राप्त नहीं होता। विकल्प:
  • फोरग्राउंड सर्विस के साथ FOREGROUND_SERVICE_PHONE_CALL टाइप
  • CallScreeningService (कॉल स्क्रीनिंग के लिए)
  • TelecomManager और Call.Companion API

मॉडर्न दृष्टिकोण: CallScreeningService (API 26+)

import android.telecom.CallScreeningService;
import android.telecom.Call.Details;

public class MyCallScreeningService extends CallScreeningService {
    @Override
    public void onScreenCall(Details callDetails) {
        // कॉल स्क्रीनिंग लॉजिक
        CallResponse.Builder response = new CallResponse.Builder();
        
        if (shouldBlock(callDetails)) {
            response.setRejectCall(true);
        } else {
            response.setSilenceRinger(false);
        }
        
        respondToCall(callDetails, response.build());
    }
    
    private boolean shouldBlock(Details details) {
        // ब्लॉकिंग लॉजिक लागू करें
        return false;
    }
}

AndroidManifest.xml में सर्विस

<service 
    android:name=".MyCallScreeningService"
    android:permission="android.permission.BIND_SCREENING_SERVICE"
    android:exported="true">
    <intent-filter>
        <action android:name="android.telecom.CallScreeningService" />
    </intent-filter>
</service>

नोट

आउटगोइंग कॉल्स के लिए NEW_OUTGOING_CALL ब्रॉडकास्ट डीप्रिकेटेड है (API 29+)। मॉडर्न ऐप्स के लिए CallScreeningService या TelecomManager का उपयोग करें।

  1. एंड्रॉइड में डिवाइस फोन है या टैबलेट कैसे पहचानें एंड्रॉइड में डिवाइस फोन है या टैबलेट कैसे पहचानें

    TelephonyManager और स्क्रीन आकार के माध्यम से डिवाइस प्रकार निर्धारित करना एंड्रॉइड में फोन और टैबलेट के बीच अंतर करने के कई तरीके हैं। सबसे विश्वसनीय विधि TelephonyManager.getPhoneType() है जो वॉयस कॉल क्षमता जांचता है, लेकिन स्क्रीन आकार और UI मोड भी उपयोगी संकेत देते हैं। चरण 1: नया प्रोजेक्ट बन

  1. अपने Android डिवाइस को सुरक्षित रूप से रूट करें – PC की आवश्यकता नहीं अपने Android डिवाइस को सुरक्षित रूप से रूट करें – PC की आवश्यकता नहीं

    Android डिवाइस को रूट करना शुरुआती और शौकीनों के लिए एक डराने वाला काम हो सकता है। इसमें शामिल जोखिमों के कारण, लोग अक्सर अपने Android स्मार्टफोन को रूट करने से हिचकिचाते हैं। शुरुआत के लिए, रूट करने के बाद आप किसी भी वारंटी दावे को खो देंगे, और अगर प्रक्रिया में कुछ गलत होता है, तो आपका फ़ोन स्थाय

  1. एंड्रॉइड पर व्हाट्सएप कॉल्स को साइलेंट करें: स्टेप-बाय-स्टेप गाइड एंड्रॉइड पर व्हाट्सएप कॉल्स को साइलेंट करें: स्टेप-बाय-स्टेप गाइड

    आप कई व्हाट्सएप ग्रुप्स का हिस्सा हो सकते हैं, या आपको बहुत सारे व्हाट्सएप कॉल्स आते होंगे जो अप्रासंगिक हैं। हम समझते हैं कि जब आप किसी महत्वपूर्ण बिजनेस कॉल या मीटिंग के बीच में हों, तो रोजाना इतने सारे व्हाट्सएप कॉल्स से निपटना थका देने वाला हो सकता है। अगर आप अपने फोन को वाइब्रेट पर रखते हैं, त