2013-09-24 14 views
26

मैंने कुछ एसओ पोस्ट देखे जो कि फोन कॉल प्रोग्राम को समाप्त करने के तरीके के बारे में चर्चा करते हैं, उदाहरण के लिए, this one। हां, लोग परिणाम पर ध्यान केंद्रित करते हैं लेकिन कोई भी वास्तव में कारण बताता है कि यह क्यों काम करता है?ITelephony.aidl क्यों काम करता है?

मैंने कोड की कोशिश की, यह अच्छी तरह से काम करता है। लेकिन मैं नीचे क्या हो रहा है के बारे में अधिक जानकारी जानना चाहूंगा? ITelephony.aidl बनाकर, एंड्रॉइड छुपा आंतरिक ITelephony इंटरफ़ेस हमारी परियोजना में खुलासा क्यों है? ITelephony.aidl & स्वचालित रूप से जेनरेट किया गया जावा (/gen/ITelephony.java) एंड्रॉइड के ITelephony इंटरफ़ेस से लिंक कैसे बनाया गया है? क्या यह केवल नाम मिलान के कारण है (पैकेज नाम & सहायता फ़ाइल नाम)?

TelephonyManager tm = (TelephonyManager) context 
       .getSystemService(Context.TELEPHONY_SERVICE); 

Class c = Class.forName(tm.getClass().getName()); 
Method m = c.getDeclaredMethod("getITelephony"); 
m.setAccessible(true); 

//Why does the android internal ITelephony interface is exposed after created the ITelephony.aidl? 
com.android.internal.telephony.ITelephony telephonyService = (ITelephony) m.invoke(tm); 
telephonyService.endCall(); 

उत्तर

72

वास्तव में, अपनी परियोजना के लिए 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 ऑब्जेक्ट की वास्तविक श्रेणी परिभाषा से मेल खाता है। यदि कक्षा परिभाषाएं मेल नहीं खाती हैं, तो वीएम एक उचित अपवाद फेंक देगा।

मुझे आशा है कि यह आपके प्रश्न का उत्तर देगा। मुझे बिल्कुल यकीन नहीं था कि आप इसके बारे में कितना पहले से जानते थे, इसलिए हो सकता है कि मैंने उन चीजों का उल्लेख किया जो आप पहले ही जानते हैं। यदि हां, तो इसके बारे में खेद है।यदि यह स्पष्ट नहीं है, तो कृपया इंगित करें कि आप वास्तव में क्या समझ में नहीं आते हैं।

+1

धन्यवाद, यह मेरे डिजाइन में मेरी मदद करता है। अच्छी नौकरी – RobinSingh

+0

क्या यह सिर्फ मुझे है या यह एंड्रॉइड 4.2.2 – 130nk3r5

+1

शानदार, विस्तृत उत्तर के लिए काम नहीं करता है। धन्यवाद। नोट: मुझे विश्वास नहीं है कि एंड्रॉइड 4.0.3 के बाद ब्लॉक कॉल काम करता है क्योंकि यह एपीआई हटा दिया गया था। – raddevus

संबंधित मुद्दे