Android में इनकमिंग कॉल प्रोग्रामेटिकली उठाना
⚠️ महत्वपूर्ण चेतावनी: Android 4.1 (API 16) से, थर्ड-पार्टी ऐप्स प्रोग्रामेटिकली कॉल नहीं उठा सकते। यह सुरक्षा प्रतिबंध है। केवल सिस्टम ऐप्स या डिफॉल्ट डायलर (CALL_PRIVILEGED परमिशन के साथ) ऐसा कर सकते हैं।
इतिहास और वर्तमान स्थिति
| Android वर्जन | कॉल उठाना संभव? | तरीका |
|---|---|---|
| API 15 और पहले | हां | HEADSETHOOK की इवेंट ब्रॉडकास्ट |
| API 16-22 | सीमित | रिफ्लेक्शन से ITelephony एंडपॉइंट |
| API 23+ (Marshmallow) | नहीं (थर्ड-पार्टी) | ब्लॉक्ड - सिक्योरिटी पॉलिसी |
| API 28+ (Pie) | नहीं | कॉल स्क्रीनिंग API उपयोग करें |
आधुनिक विकल्प: CallScreeningService (API 28+)
Android 9+ में, CallScreeningService इम्प्लीमेंट करें:
// Manifest में सेवा घोषित करें
<service android:name=".MyCallScreeningService"
android:permission="android.permission.BIND_SCREENING_SERVICE">
<intent-filter>
<action android:name="android.telecom.CallScreeningService" />
</intent-filter>
</service>
// Service इम्प्लीमेंटेशन
public class MyCallScreeningService extends CallScreeningService {
@Override
public void onScreenCall(Call.Details callDetails) {
CallResponse.Builder response = new CallResponse.Builder();
// कॉल उठाने के लिए (केवल सिस्टम/डिफॉल्ट डायलर)
// response.setDisallowCall(false);
// कॉल रिजेक्ट करें
// response.setRejectCall(true);
// कॉल साइलेंस करें
response.setSilenceCall(true);
respondToCall(callDetails, response.build());
}
}
लीगेसी कोड (केवल संदर्भ के लिए - अब काम नहीं करता)
मूल कोड जो ITelephony रिफ्लेक्शन का उपयोग करता था:
// यह कोड आधुनिक Android पर काम नहीं करता
try {
Class<?> clazz = Class.forName("android.os.ServiceManager");
Method method = clazz.getDeclaredMethod("getService", String.class);
method.setAccessible(true);
IBinder binder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);
ITelephony telephony = ITelephony.Stub.asInterface(binder);
telephony.answerRingingCall(); // हिडन API
} catch (Exception e) {
e.printStackTrace();
}
क्या कर सकते हैं (वर्तमान Android)
- कॉल डिटेक्ट करें:
TelephonyManager+PhoneStateListener - कॉल लॉग करें: READ_CALL_LOG परमिशन के साथ
- कॉल ब्लॉक करें: CallScreeningService (API 28+) या TelecomManager
- कस्टम इनकमिंग कॉल UI दिखाएं: फोरग्राउंड सर्विस + नोटिफिकेशन
- डिफॉल्ट डायलर बनें: यूजर सेटिंग्स में अपना ऐप डिफॉल्ट डायलर सेट कर सकता है
कॉल स्टेट डिटेक्शन उदाहरण
public class CallDetector {
private TelephonyManager telephonyManager;
private PhoneStateListener phoneStateListener;
public void startListening(Context context) {
telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
phoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
// इनकमिंग कॉल - UI दिखाएं, लॉग करें, आदि
showIncomingCallUI(incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
// कॉल उठाया गया
break;
case TelephonyManager.CALL_STATE_IDLE:
// कॉल खत्म
hideIncomingCallUI();
break;
}
}
};
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
public void stopListening() {
if (telephonyManager != null && phoneStateListener != null) {
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
}
}
}
मैनिफेस्ट परमिशन
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CALL_LOG" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <!-- API 28+ --> <uses-permission android:name="android.permission.MANAGE_OWN_CALLS" /> <!-- API 29+ -->
निष्कर्ष
आधुनिक Android (API 23+) पर थर्ड-पार्टी ऐप्स कॉल प्रोग्रामेटिकली नहीं उठा सकते। इसके बजाय:
CallScreeningServiceइम्प्लीमेंट करें कॉल स्क्रीनिंग/ब्लॉकिंग के लिए- फोरग्राउंड सर्विस + हाई-प्रायोरिटी नोटिफिकेशन से कस्टम इनकमिंग UI दिखाएं
- यूजर को मैन्युअली कॉल उठाने दें
- अगर पूर्ण नियंत्रण चाहिए तो डिफॉल्ट डायलर ऐप बनाएं