एंड्रॉइड में फोन स्टेट मॉनिटरिंग (कॉल डिटेक्शन)
यह गाइड 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+) के लिए महत्वपूर्ण बदलाव
PHONE_STATE ब्रॉडकास्ट प्राप्त नहीं होता।
विकल्प:
- फोरग्राउंड सर्विस के साथ
FOREGROUND_SERVICE_PHONE_CALLटाइप - CallScreeningService (कॉल स्क्रीनिंग के लिए)
- TelecomManager और
Call.CompanionAPI
मॉडर्न दृष्टिकोण: 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 का उपयोग करें।