ऐप

2016-06-09 16 views
10

में एकाधिक नेटवर्क इंटरफेस का उपयोग करें मैंने एक ऐप लिखा है जो वाईफाई पर सोनी क्यूएक्स स्मार्टफोन अटैच करने योग्य कैमरा ट्रिगर कर रहा है। हालांकि मुझे वास्तविक समय में फोन को अन्य स्थानीय नेटवर्क पर फोन से स्थानांतरित करने की आवश्यकता है। चूंकि वाईफ़ाई कार्ड का उपयोग क्यूएक्स कनेक्शन के लिए किया जा रहा है, इसलिए मुझे फोन से छवियों को स्थानांतरित करने के लिए यूएसबी पर ईथरनेट का उपयोग करने में सक्षम होना चाहिए। एचटीपी अनुरोध कैमरे को ट्रिगर करने और फोन से छवियों को भेजने के लिए इस्तेमाल किया जाएगा।ऐप

क्या एक नेटवर्क इंटरफ़ेस सेटअप के साथ एक नेटवर्क पर एक एंड्रॉइड ऐप में एक नेटवर्क इंटरफ़ेस का उपयोग करने के लिए कुछ और अन्य नेटवर्क इंटरफ़ेस का उपयोग करने के लिए यह निर्दिष्ट करना संभव है? क्या यह रूटिंग टेबल के माध्यम से किया जाना चाहिए, जावा नहीं?

मैं जिस फोन का उपयोग कर रहा हूं वह एक रूट नेक्सस 6 पी है।

अद्यतन:

वर्तमान में, मैं एक ईथरनेट डिवाइस (Nexus 6P) के साथ काम एडाप्टर प्राप्त करने में सक्षम था। डिवाइस ईथरनेट पर स्थानीय नेटवर्क से जुड़ा हुआ है। जब वाई-फाई इंटरफ़ेस बंद होता है, तो मैं स्थानीय नेटवर्क पर सभी डिवाइसों को पिंग कर सकता हूं, डिवाइस ईथरनेट से कनेक्ट है। हालांकि, मैं उस नेटवर्क पर किसी भी डिवाइस के वेब सर्वर (DNS का उपयोग नहीं कर रहा) तक पहुंचने में असमर्थ हूं (जो मुझे पता है कि वे चल रहे हैं), यानी ब्राउज़र ऐप के माध्यम से एचटीपी। नेक्सस 6 पी एक यूबिनेट स्टेशन के माध्यम से ईथरनेट पर नेटवर्क से जुड़ा हुआ है। यह एक रूटिंग मुद्दा प्रतीत होता है।

मैं टेदर (यूएसबी इंटरफेस) कर सकता हूं और एक ऐप में वाई-फाई का उपयोग कर सकता हूं, जिससे मुझे विश्वास होता है कि ईथरनेट और वाई-फाई का उपयोग करना संभव है।

Update2:

अधिक परीक्षण के बाद, यह हो सकता है कि यह एक अनुमतियाँ मुद्दा है लगता है। चूंकि जब मैं नेटवर्क को पिंग करता हूं तो डिवाइस टर्मिनल में पहले su चलाने के बिना ईथरनेट से कनेक्ट होता है, नेटवर्क मौजूद नहीं होता है। हालांकि, जब मैं su चलाता हूं तो पिंग, मैं नेटवर्क को पिंग कर सकता हूं। इस प्रकार ऐसा लगता है कि मेरे ऐप को ईथरनेट तक पहुंचने से पहले सुपरसुर अनुमति प्राप्त करने की आवश्यकता है। मैंने इसे सुपरसुर एक्सेस दिया है, लेकिन कुछ भी नहीं बदला है। मैंने पढ़ा है कि su चल रहा है post में टिप्पणियों में से एक से पर्याप्त नहीं है। ऐसा इसलिए है क्योंकि su बस एक रूट खोल खोलता है जो मर जाता है। यह भी बताता है कि मैं ब्राउज़र नेटवर्क के माध्यम से इस नेटवर्क पर किसी भी वेब सर्वर का उपयोग क्यों नहीं कर सका। क्या HTTP ऐप बनाने के दौरान ईथरनेट इंटरफ़ेस तक पहुंचने के लिए संभव है, जैसे HttpURLConnection रूट पहुंच दें, अगर यह कोई समझ में आता है (su काम नहीं करता है)? ऐसा लगता है कि HttpURLConnection यूएसबी टेदरिंग इंटरफेस पर कॉल कर सकता है (नेक्सस 6 पी इसे rndis0 कहते हैं) ठीक है।

अद्यतन 3:

मैं ऑनलाइन here पाया, कि मैं अपने अनुप्रयोग एक सिस्टम एप्लिकेशन बना सकते हैं (सोचा इस एप्लिकेशन eth0 को पहुंच देने सकता है)। मैंने बस अपना ऐप /system/app पर ले जाया और फिर रीबूट किया। हालांकि, ऐसा लगता है कि ऐप अब और विशेषाधिकार नहीं दे रहा है (इस प्रकार समस्या को हल नहीं कर रहा है), या ऐप सिस्टम को सिर्फ /system/app पर कॉपी करने के लिए कुछ और आवश्यक है।

अद्यतन 4:

तो मैं जड़ अनुमतियों के बिना ईथरनेट हर एप्लिकेशन पर काम कर प्राप्त करने में सक्षम था! ऐसा लगता है कि यह केवल डीएचसीपी पर काम करता है और मुझे स्थिर कनेक्शन पसंद नहीं है, जिसका मैं उपयोग कर रहा था। यह वाई-फाई सक्षम के साथ काम करता है, हालांकि, जब ईथरनेट सक्षम होता है तो मैं वाई-फाई नेटवर्क पर किसी भी डिवाइस से संपर्क नहीं कर सकता। क्या इसके चारों ओर एक रास्ता है?क्या इसे दो डिफ़ॉल्ट गेटवे सेट करने के साथ करना है?

उत्तर

2

जब से तुम Nexus 6P में प्रोग्रामिंग कर रहे थे, तो आप अपने प्रक्रिया के लिए अपना पसंदीदा नेटवर्क कनेक्शन के रूप में चयन करने के लिए ईथरनेट ConnectivityManager में जोड़े गए नए एपीआई का उपयोग करने की कोशिश कर सकते कर सकते हैं।

चूंकि मैं आपके जैसे समान वातावरण का निर्माण नहीं कर सकता, मुझे यकीन नहीं है कि यह काम करता है या नहीं। यह सिर्फ एक सुझाया गया समाधान है, पूरी तरह से परीक्षण और सत्यापित नहीं है।

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
Network etherNetwork = null; 
for (Network network : connectivityManager.getAllNetworks()) { 
    NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network); 
    if (networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) { 
     etherNetwork = network; 
    } 
} 
Network boundNetwork = connectivityManager.getBoundNetworkForProcess(); 
if (boundNetwork != null) { 
    NetworkInfo boundNetworkInfo = connectivityManager.getNetworkInfo(boundNetwork); 
    if (boundNetworkInfo.getType() != ConnectivityManager.TYPE_ETHERNET) { 
     if (etherNetwork != null) { 
      connectivityManager.bindProcessToNetwork(etherNetwork); 
     } 
    } 
} 
+0

तो मैंने अभी इस विधि की कोशिश की। 'connectivityManager.getAllNetworks() 'केवल वाई-फाई इंटरफ़ेस (लंबाई = 1) लौटाता है, जब मेरे पास ईथरनेट और वाई-फाई है, और यह केवल ईथरनेट चालू होने पर कुछ भी नहीं लौटाता है (लंबाई = 0)। एक इंटरफ़ेस के रूप में 'ifconfig' रिटर्न' eth0' चलाने के बाद डिवाइस में स्पष्ट रूप से इंटरफ़ेस है, और जैसा कि मैंने ऊपर बताया है, मैं डिवाइस को पिंग कर सकता हूं। मैंने अपने ऐप को सिस्टम एप में ले जाने की भी कोशिश की। हालांकि, मुझे लगता है कि ऐप सिस्टम को '/ system/app' पर ले जाने के बाद से मुझे एक कदम याद आया, ऐसा लगता है कि बिल्कुल कुछ भी नहीं करना है। – dylan7

+0

रूट पर स्विच करें, एपीके के उपयोगकर्ता और समूह के मालिक को रूट में संशोधित करें। फिर एपीके की अनुमति 644 पर बदलें। 'su',' chown root.root/system/app/your.apk', 'chmod 644/system/app/your.apk'। फिर आपके कोड में eth0 डिवाइस तक पहुंचने की अनुमति हो सकती है। – alijandro

+0

यदि आपको लगता है कि सिस्टम ऐप बनाने में कोई समस्या है, तो लॉगकैट की जांच करें। जब ऐप खोल कमांड चलाने की कोशिश करता है तो आपको अनुमति त्रुटि मिल जाएगी। – ekilic

0

अधिकांश एंड्रॉइड टीवी बॉक्स वाईफ़ाई और ईथरनेट का एक साथ उपयोग कर सकते हैं। मेरे डिवाइस में, मैं इस पथ से ईथरनेट सक्षम कर सकता हूं --- सेटिंग्स -> अधिक ...> ईथरनेट --- लेकिन आपके डिवाइस में ऐसा मेनू नहीं है जैसा कि मैं समझता हूं। तो आपको ऐसा करने के लिए एक ऐप बनाना चाहिए। इस एप्लिकेशन को कुछ सिस्टम विशिष्ट संसाधनों तक पहुंचने की आवश्यकता है, इसलिए आपके डिवाइस को रूट करने की आवश्यकता है या सिस्टम हस्ताक्षर के साथ आवेदन करने की आवश्यकता है। इसके अलावा इस विषय पर आप link

+0

ऐसा लगता है कि Nexus 6P को 'getSystemService ("ethernet") तक पहुंच नहीं है, क्योंकि यह आपके द्वारा लिंक की गई पोस्ट में उपयोग करने के लिए कहता है। – dylan7

0

बस अंततः हल होने के तरीके पर थोड़ा और स्पष्टीकरण देने के लिए।

@ अलीजेंड्रो के उत्तर का उपयोग करके मैं एक ऐप में ईथरनेट और वाई-फाई के बीच आगे और पीछे स्विच करने में सक्षम था। ईथरनेट के काम करने के किसी कारण के लिए इसे नेटवर्क गेटवे की आवश्यकता है जो डीएचसीपी पते की आपूर्ति करे, स्थिर नहीं। उसके बाद bindProcessToNetwork, @ अलीजेंड्रो के उत्तर में उपयोग किया जाने वाला प्रति-प्रक्रिया है, मैंने क्यूएक्स कैमरे के साथ संचार को Service में विभाजित करने का निर्णय लिया जो एक अलग प्रक्रिया में चलता है। मुख्य अनुप्रयोग (एक और प्रक्रिया) ईथरनेट पर स्थानीय नेटवर्क पर छवियों को पोस्ट करेगा। मैं ईथरनेट पर HTTP के माध्यम से स्थानीय नेटवर्क पर डिवाइसों से संपर्क करने में सफलतापूर्वक संपर्क कर रहा था, साथ ही वाई-फाई पर क्यूएक्स को ट्रिगर कर रहा था। वर्तमान में, मैंने Messenger का उपयोग करके आईपीसी का उपयोग करके संवाद करने के लिए Service को कॉल करने के तरीकों को ट्रिगर करने के लिए कहा था।