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

Android में इनकमिंग कॉल को प्रोग्रामेटिकली कैसे उठाएं?

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+) पर थर्ड-पार्टी ऐप्स कॉल प्रोग्रामेटिकली नहीं उठा सकते। इसके बजाय:

  1. CallScreeningService इम्प्लीमेंट करें कॉल स्क्रीनिंग/ब्लॉकिंग के लिए
  2. फोरग्राउंड सर्विस + हाई-प्रायोरिटी नोटिफिकेशन से कस्टम इनकमिंग UI दिखाएं
  3. यूजर को मैन्युअली कॉल उठाने दें
  4. अगर पूर्ण नियंत्रण चाहिए तो डिफॉल्ट डायलर ऐप बनाएं
  1. एंड्रॉइड में फ्रैगमेंट से एक्टिविटी का मेथड कैसे कॉल करें एंड्रॉइड में फ्रैगमेंट से एक्टिविटी का मेथड कैसे कॉल करें

    फ्रैगमेंट से होस्ट एक्टिविटी के पब्लिक मेथड को कॉल करने के तरीके एंड्रॉइड में फ्रैगमेंट अपनी होस्ट एक्टिविटी के साथ getActivity() के माध्यम से संवाद कर सकता है। एक्टिविटी के पब्लिक मेथड को कॉल करने के लिए फ्रैगमेंट को एक्टिविटी को उपयुक्त टाइप में कास्ट करना होता है। यह पैटर्न फ्रैगमेंट-एक्टिविटी सं

  1. Android ऐप को प्रोग्रामेटिकली कैसे बंद करें? Android ऐप को प्रोग्रामेटिकली कैसे बंद करें?

    यह उदाहरण दर्शाता है कि Android ऐप को बटन क्लिक पर प्रोग्रामेटिकली कैसे बंद किया जाता है। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project। चरण 2: लेआउट XML res/layout/activity_main.xml: <?xml version=1.0 encoding=utf-8?> <RelativeLayout xmlns:android=https://schemas

  1. एंड्रॉइड पर यथार्थवादी फेक इनकमिंग कॉल बनाएं – एक त्वरित गाइड एंड्रॉइड पर यथार्थवादी फेक इनकमिंग कॉल बनाएं – एक त्वरित गाइड

    ऐसे समय होते हैं, जब आप कुछ बातचीत से बचना चाहते हैं या एक सुस्त और उबाऊ पार्टी से जल्दी निकलना चाहते हैं लेकिन हमारे सामाजिक मानदंड और मूल्य हमें ऐसा करने से रोकते हैं। सौभाग्य से, Google Play Store पर बहुत सारे थर्ड-पार्टी ऐप्स उपलब्ध हैं जो वास्तविक दिखने वाले फेक कॉल के साथ आपको किसी भी स्थिति स