मुझे एक डीएसएलआर कैमरा और सैमसंग गैलेक्सी टैब एंड्रॉइड हनीकॉम चला रहा है। डीएसएलआर यूएसबी-केबल का उपयोग कर एक टैबलेट से जुड़ा हुआ है (यूएसबी किट के माध्यम से टैबलेट पर मेजबान कार्यक्षमता सक्षम करता है)। जब मैं इस छवि को टैबलेट पर डाउनलोड करने के लिए या छवि से ली गई मेटा-सूचना युक्त टोस्ट अधिसूचना दिखाने के लिए कुछ और करता हूं, तो मैं इस बाहरी कैमरे का उपयोग करके एक फोटो लेता हूं, जब मैं अधिसूचित होना चाहता हूं।हनीकॉम या बाद के एंड्रॉइड संस्करणों के लिए बाहरी यूएसबी स्टोरेज में बदलावों के लिए देखें
मैं मौजूदा उपकरणों के सभी मिलता है जहां तक (जैसे FileObserver
अंतर्निहित inotify
तंत्र, MediaContentProvider
आदि का प्रयोग करके) परिवर्तन के लिए देखने के लिए अनुमति देता है, मांग एक विशिष्ट फ़ाइल या एक फाइल सिस्टम पथ देखे जाने के लिए। यह तब तक काफी अच्छा था जब तक हमारे पास 2.x और पहले के एंड्रॉइड संस्करणों में ब्लॉक लेयर प्रोटोकॉल समर्थन नहीं था - जब आप डिवाइस से जुड़े होते हैं तो इसे डिवाइस के फाइल सिस्टम पर कहीं भी घुमाया जाएगा और आप इन माउंटपॉइंट को उन उपकरणों के लिए घड़ी बिंदु के रूप में उपयोग करने में सक्षम थे ।
चूंकि हनीकॉम Google ने Media Transfer Protocol
पर Media Transfer Protocol
के साथ बाहरी यूएसबी उपकरणों तक पहुंचने का तरीका बदल दिया है, इसके सबसेट के रूप में PTP
। अब जब मैं एक एंड्रॉइड डिवाइस पर बाहरी यूएसबी डिवाइस को कनेक्ट करता हूं तो मुझे इसके लिए कोई माउंट पॉइंट नहीं दिखाई देगा (मैं adb shell
और बाद में mount
उन्हें प्राप्त करने के लिए कमांड का उपयोग कर रहा हूं)। इसके अलावा, MTP
कार्यान्वयन भंडारण आईडी का उपयोग करता है जो स्पष्ट रूप से उच्च स्तर के अमूर्तता के रूप में कार्य करता है और केवल सादा पूर्णांक मान हैं। मैं उम्मीद कर रहा था कि किसी भी तरह से इन स्टोरेज आईडी को वास्तविक पथ/माउंटपॉइंट/जो कुछ भी स्पष्ट रूप से दिखाई नहीं दे रहा है, का अनुवाद करने का कोई तरीका है।
एंड्रॉयड MediaScanner
जो पहले से ही अपने उपकरण पर चल रहे के बारे में सोच रही थी कि मैं इसे एक विशेष Intent
प्रसारित जब वहाँ मीडिया में होने पर परिवर्तन डिवाइस से एक्सेस फ़ाइलें के साथ इस मुद्दे का प्रबंधन कर सकता अनुमान लगाया, तो मैं पहले से ही विद्यमान है और उपयुक्त Intents
की तलाश शुरू कर अधिसूचित होने के लिए, लेकिन कोई भाग्य नहीं - मुझे केवल ACTION_MEDIA_MOUNTED
और ACTION_MEDIA_REMOVED
मिले जो केवल तभी प्रसारित होते हैं जब डिवाइस कनेक्ट हो और क्रमशः डिस्कनेक्ट हो जाए। इसका मतलब है कि MediaScanner
डिवाइस पर किसी भी बदलाव को तब तक नहीं देख सकता जब तक कि आप इसे रिमाउंट नहीं करते हैं (मैंने स्टॉक गैलरी ऐप का उपयोग करके इसे दो बार चेक किया है - जब तक आप अनप्लग नहीं करते हैं तब तक कैमरे पर कोई भी नई बनाई गई छवियां नहीं दिखाई देती हैं और फिर इसे एंड्रॉइड में प्लग करें डिवाइस फिर से)।
बाहरी sdcard के लिए इस पर्वत पथ प्राप्त करने के लिए कोशिश कर रहा है, मैं Environment.getExternalStorageDirectory()
API कॉल का इस्तेमाल किया, लेकिन यह आकाशगंगा के sdcard पथ जो /mnt/sdcard
, नहीं कैमरे के एक है नकल करते अर्जित करता है। तो यह मेरे लिए भी काम नहीं करता है।
मैं इस समस्या को केवल Timer
ईवेंट लॉन्च करने में कामयाब रहा, AsyncTask
TimerTask
के रूप में कार्य करता है। यह कार्य यूएसबी कनेक्शन, ओपन डिवाइस, को प्रारंभ करता है, पूरे डिवाइस मेमोरी को स्कैन करता है, केवल अंतिम ली गई तस्वीर प्राप्त करता है और फिर डिवाइस डिस्क्रिप्टर और यूएसबी कनेक्शन बंद करता है।
यह ध्यान में रखते हुए यह करने का सबसे अच्छा और कारगर तरीका नहीं दिखता है, इसे हर बार इन सभी कार्यों को करना पड़ता है जो हर बार 5 या 10 सेकंड कह सकते हैं। यह निश्चित रूप से बैटरी को बाहर निकाल देता है और केवल अंतिम ली गई तस्वीर लेने के लिए अनावश्यक सिस्टम I/O का उत्पादन करता है और पिछले पिछली तस्वीर के साथ इसकी तुलना करता है (99% में यह वही छवि होगी), लेकिन मुझे कोई बेहतर कामकाजी समाधान नहीं मिला है ऐसा करने के लिए। ईवेंट-आधारित अधिसूचनाओं के साथ पर्यवेक्षक तंत्र होने के लिए यह बहुत बेहतर होगा।
तो मेरा प्रश्न है कि हनीकॉम के लिए बाहरी यूएसबी स्टोरेज में परिवर्तन या ऊपर वर्णित एक के बजाय बाद के एंड्रॉइड संस्करणों में बदलाव के बारे में अधिसूचित होने का एक और अधिक प्रभावी तरीका है?