android सकत एंड्रॉइड में आउटगोइंग कॉल कैसे लटकाएं?




सम्मेलन कॉल (7)

BroadcastReceiver रिसीवर में आउटगोइंग कॉल को कैप्चर करना का उल्लेख किया गया है और यदि आप डायलिंग से पहले कॉल समाप्त करना चाहते हैं तो यह निश्चित रूप से करने का सबसे अच्छा तरीका है।

एक बार डायलिंग या इन-कॉल करने के बाद, वह तकनीक अब काम नहीं करती है। अब तक का सामना करने का एकमात्र तरीका जावा Reflection माध्यम से ऐसा करना है। चूंकि यह सार्वजनिक एपीआई का हिस्सा नहीं है, इसलिए आपको इसका उपयोग करने के लिए सावधान रहना चाहिए , और उस पर भरोसा नहीं करना चाहिए। एंड्रॉइड की आंतरिक संरचना में कोई भी बदलाव प्रभावी ढंग से आपके आवेदन को तोड़ देगा।

प्रसंता पॉल का ब्लॉग दिखाता है कि यह कैसे पूरा किया जा सकता है, जिसे मैंने नीचे संक्षेप में बताया है।

ITelephony ऑब्जेक्ट प्राप्त करना:

TelephonyManager tm = (TelephonyManager) context
        .getSystemService(Context.TELEPHONY_SERVICE);
try {
    // Java reflection to gain access to TelephonyManager's
    // ITelephony getter
    Log.v(TAG, "Get getTeleService...");
    Class c = Class.forName(tm.getClass().getName());
    Method m = c.getDeclaredMethod("getITelephony");
    m.setAccessible(true);
    com.android.internal.telephony.ITelephony telephonyService =
            (ITelephony) m.invoke(tm);
} catch (Exception e) {
    e.printStackTrace();
    Log.e(TAG,
            "FATAL ERROR: could not connect to telephony subsystem");
    Log.e(TAG, "Exception object: " + e);
}

कॉल समाप्त करना:

telephonyService.endCall();

मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जहां हमें आवश्यक चीजों में से एक को आउटगोइंग कॉल को नियंत्रित करना है, कम से कम हमारे आवेदन से इसे रोकने में सक्षम होना।

मैंने किसी मौजूदा गतिविधि से Intent.ACTION_CALL का उपयोग करने का प्रयास किया है:

Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); 
startActivity(callIntent); 

लेकिन एपीआई के माध्यम से कॉल को रोकना प्रतीत होता है।

क्या आप कुछ कामकाज सुझा सकते हैं?

उदाहरण के लिए: कॉल के दौरान हवाई जहाज मोड सक्षम करना? बस एक उदाहरण; यह हैक मेरे लिए काम नहीं किया।



ACTION_NEW_OUTGOING_CALL पर दस्तावेज़ के अनुसार

इरादे में निम्नलिखित अतिरिक्त मूल्य होगा:

EXTRA_PHONE_NUMBER - मूल रूप से डायल किए जाने वाले फ़ोन नंबर का फ़ोन नंबर।

प्रसारण समाप्त होने के बाद, परिणामडेटा को कॉल करने के लिए वास्तविक संख्या के रूप में उपयोग किया जाता है। अगर शून्य, कोई कॉल नहीं रखा जाएगा।


  1. 0 की प्राथमिकता के साथ BroadcastReceiver बनाएं।
  2. बीसी में ACTION_NEW_OUTGOING_CALL अपनी onReceive विधि में इरादा onReceive है
  3. उसी विधि में setResultData(null) को कॉल करें

यह कॉल को शुरू करने से रोक देगा (जब तक आपका रिसीवर मुझे लगता है कि इरादे को संसाधित करने वाला आखिरी है)


आप विमान मोड को अक्षम करने के बाद सक्षम करने का प्रयास कर सकते हैं:

android.provider.Settings.System.putInt(getContentResolver(),
        android.provider.Settings.System.AIRPLANE_MODE_ON, 1);

Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", 1);
sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE"));
sendBroadcast(intent);
android.provider.Settings.System.putInt(getContentResolver(),
        android.provider.Settings.System.AIRPLANE_MODE_ON, 0);

intent.putExtra("state", 0);
sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE"));
sendBroadcast(intent);

इसे इस्तेमाल करे:

(मैंने उन्नत टेलीफोनी सुविधाओं तक पहुंचने और कुछ संशोधनों को संशोधित करने के लिए प्रतिबिंब का उपयोग किया)

// required permission <uses-permission android:name="android.permission.CALL_PHONE"/>

try {
    //String serviceManagerName = "android.os.IServiceManager";
    String serviceManagerName = "android.os.ServiceManager";
    String serviceManagerNativeName = "android.os.ServiceManagerNative";
    String telephonyName = "com.android.internal.telephony.ITelephony";

    Class telephonyClass;
    Class telephonyStubClass;
    Class serviceManagerClass;
    Class serviceManagerStubClass;
    Class serviceManagerNativeClass;
    Class serviceManagerNativeStubClass;

    Method telephonyCall;
    Method telephonyEndCall;
    Method telephonyAnswerCall;
    Method getDefault;

    Method[] temps;
    Constructor[] serviceManagerConstructor;

    // Method getService;
    Object telephonyObject;
    Object serviceManagerObject;

    telephonyClass = Class.forName(telephonyName);
    telephonyStubClass = telephonyClass.getClasses()[0];
    serviceManagerClass = Class.forName(serviceManagerName);
    serviceManagerNativeClass = Class.forName(serviceManagerNativeName);

    Method getService = // getDefaults[29];
    serviceManagerClass.getMethod("getService", String.class);

    Method tempInterfaceMethod = serviceManagerNativeClass.getMethod(
                "asInterface", IBinder.class);

    Binder tmpBinder = new Binder();
    tmpBinder.attachInterface(null, "fake");

    serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder);
    IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone");
    Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class);

    telephonyObject = serviceMethod.invoke(null, retbinder);
    //telephonyCall = telephonyClass.getMethod("call", String.class);
    telephonyEndCall = telephonyClass.getMethod("endCall");
    //telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall");

    telephonyEndCall.invoke(telephonyObject);

} catch (Exception e) {
    e.printStackTrace();
    Log.error(DialerActivity.this,
                "FATAL ERROR: could not connect to telephony subsystem");
    Log.error(DialerActivity.this, "Exception object: " + e);
}

इलाना के लिए:

public class ilanasReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            if (getResultData()!=null) {
                String number = "123456";
                setResultData(number);
            }
        }
    }
}

मैनिफेस्ट में पैकेज अनुभाग में डाल दिया गया है:

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

बस इतना ही।







telephonymanager