वास्तव में, अपनी परियोजना के लिए ITelephony.aidl
जोड़ने आवश्यक नहीं, यह सिर्फ एक सुविधा है।
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
Object telephonyService = m.invoke(tm); // Get the internal ITelephony object
c = Class.forName(telephonyService.getClass().getName()); // Get its class
m = c.getDeclaredMethod("endCall"); // Get the "endCall()" method
m.setAccessible(true); // Make it accessible
m.invoke(telephonyService); // invoke endCall()
कवर के तहत यह सब जावा प्रतिबिंब का उपयोग कर काम करता है निजी (यानी: सार्वजनिक रूप से दर्ज नहीं किया) तक पहुँचने के लिए: तरीकों तुम बस के रूप में अच्छी तरह से यह इस तरह से कर सकता है। आप ओपन-सोर्स (यानी: सार्वजनिक रूप से उपलब्ध) एंड्रॉइड स्रोत कोड पढ़कर, वहां क्या तरीके हैं, और वे क्या करते हैं, यह पता लगा सकते हैं। एक बार जब आप जानते हैं कि वहां क्या है और यह क्या करता है, तो आप इसे पाने के लिए प्रतिबिंब का उपयोग कर सकते हैं, भले ही यह "छुपा" हो।
TelephonyManager
कक्षा दूरस्थ सेवा का उपयोग कर लागू की गई है। यदि आप TelephonyManager
से आपके लिए कुछ करने के लिए अनुरोध करना चाहते हैं, तो आप TelephonyManager
(यह सार्वजनिक रूप से प्रलेखित भाग है) पर एक विधि कॉल करते हैं और आंतरिक रूप से यह वास्तव में काम करने के लिए दूरस्थ टेलीफ़ोनी सेवा पर कॉल करता है। यह एआईडीएल का उपयोग करके किया जाता है, जो कि "रिमोट प्रोसेस कॉल" का एक प्रकार है। रिमोट सेवा ऐसी चीजें कर सकती है जो TelephonyManager
कक्षा के माध्यम से सार्वजनिक रूप से प्रकट नहीं होती हैं। आप यहां क्या कर रहे हैं getITelephony()
का उपयोग कर "रिमोट प्रोसेस कॉल" इंटरफ़ेस का क्लाइंट-साइड प्राप्त कर रहा है। यह ITelephony
प्रकार का ऑब्जेक्ट देता है। इस वर्ग में endCall()
नामक एक विधि है। एक बार हमारे पास ITelephony
टाइप करने का ऑब्जेक्ट हो जाने पर, हम कक्षा क्लास ऑब्जेक्ट प्राप्त कर सकते हैं और फिर कक्षा से endCall()
विधि प्राप्त कर सकते हैं। एक बार हमारे पास विधि हो जाने के बाद, हम इसे सुलभ बनाते हैं और इसे कॉल करने के बजाय। विधि endCall()
रिमोट प्रक्रिया कॉल के क्लाइंट-साइड में है। विधि अब टेलीफ़ोनी प्रबंधक सेवा (जो रिमोट सर्वर में चल रही है) को एक संदेश भेजती है और कॉल को समाप्त करने के लिए कहती है।
के बाद से ITelephony.aidl
के लिए स्रोत कोड सार्वजनिक रूप से उपलब्ध है, तो आप स्रोत कोड अपनी परियोजना में ITelephony.aidl
से रख सकते हैं और अपने आईडीई ITelephony.java
उत्पन्न होगा (जो दूरस्थ प्रक्रिया कॉल के क्लाइंट छोर शामिल हैं)। आप बस import
कर सकते हैं कि आपका आईडीई अब ITelephony
वर्ग और इसकी विधियों के बारे में जानेंगे। यह आपके प्रोजेक्ट को संकलित करते समय संकलक को सही बाइट-कोड उत्पन्न करने की अनुमति देता है। जब आप एंड्रॉइड डिवाइस पर यह कोड चलाते हैं, तो आप ITelephony
ऑब्जेक्ट प्राप्त करने के लिए एंड्रॉइड फ्रेमवर्क में कॉल करते हैं और फिर आप इसे com.android.internal.telephony.ITelephony
पर डाल देते हैं। तब से, आप उत्पन्न ITelephony.java
का उपयोग कर ऑब्जेक्ट के विधियों और फ़ील्ड तक पहुंच सकते हैं जब तक आपके पास ITelephony
के लिए जावा कोड ITelephony
ऑब्जेक्ट की वास्तविक श्रेणी परिभाषा से मेल खाता है। यदि कक्षा परिभाषाएं मेल नहीं खाती हैं, तो वीएम एक उचित अपवाद फेंक देगा।
मुझे आशा है कि यह आपके प्रश्न का उत्तर देगा। मुझे बिल्कुल यकीन नहीं था कि आप इसके बारे में कितना पहले से जानते थे, इसलिए हो सकता है कि मैंने उन चीजों का उल्लेख किया जो आप पहले ही जानते हैं। यदि हां, तो इसके बारे में खेद है।यदि यह स्पष्ट नहीं है, तो कृपया इंगित करें कि आप वास्तव में क्या समझ में नहीं आते हैं।
स्रोत
2013-09-24 18:21:04
धन्यवाद, यह मेरे डिजाइन में मेरी मदद करता है। अच्छी नौकरी – RobinSingh
क्या यह सिर्फ मुझे है या यह एंड्रॉइड 4.2.2 – 130nk3r5
शानदार, विस्तृत उत्तर के लिए काम नहीं करता है। धन्यवाद। नोट: मुझे विश्वास नहीं है कि एंड्रॉइड 4.0.3 के बाद ब्लॉक कॉल काम करता है क्योंकि यह एपीआई हटा दिया गया था। – raddevus