2012-04-27 7 views
20

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

मैं मौजूदा उपकरणों के सभी मिलता है जहां तक ​​(जैसे 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 ईवेंट लॉन्च करने में कामयाब रहा, AsyncTaskTimerTask के रूप में कार्य करता है। यह कार्य यूएसबी कनेक्शन, ओपन डिवाइस, को प्रारंभ करता है, पूरे डिवाइस मेमोरी को स्कैन करता है, केवल अंतिम ली गई तस्वीर प्राप्त करता है और फिर डिवाइस डिस्क्रिप्टर और यूएसबी कनेक्शन बंद करता है।

यह ध्यान में रखते हुए यह करने का सबसे अच्छा और कारगर तरीका नहीं दिखता है, इसे हर बार इन सभी कार्यों को करना पड़ता है जो हर बार 5 या 10 सेकंड कह सकते हैं। यह निश्चित रूप से बैटरी को बाहर निकाल देता है और केवल अंतिम ली गई तस्वीर लेने के लिए अनावश्यक सिस्टम I/O का उत्पादन करता है और पिछले पिछली तस्वीर के साथ इसकी तुलना करता है (99% में यह वही छवि होगी), लेकिन मुझे कोई बेहतर कामकाजी समाधान नहीं मिला है ऐसा करने के लिए। ईवेंट-आधारित अधिसूचनाओं के साथ पर्यवेक्षक तंत्र होने के लिए यह बहुत बेहतर होगा।

तो मेरा प्रश्न है कि हनीकॉम के लिए बाहरी यूएसबी स्टोरेज में परिवर्तन या ऊपर वर्णित एक के बजाय बाद के एंड्रॉइड संस्करणों में बदलाव के बारे में अधिसूचित होने का एक और अधिक प्रभावी तरीका है?

उत्तर

2

यदि आप एक अधिक कुशल तरीका चाहते हैं तो कैमरे को यूएसबी पर कुछ प्रकार का संकेत भेजना होगा कि उसने एक तस्वीर ली है। मुझे लगता है कि यह ऐसा नहीं कर रहा है।

इसलिए आप जिस तरह से अपने discribing कर रहे हैं ऐसा करके मैन्युअल रूप से जाँच करने के लिए होगा:

मेमोरी माउंट -> परिवर्तन के लिए जाँच -> आपके पाए गए परिवर्तनों के साथ अपना काम करने में।

मुझे पता है कि आप "एमटीपी रास्ता" लेकिन यहाँ एक उदाहरण आवेदन को पढ़ने के लिए प्रयोग किया जाता है न:

https://github.com/ynakanishi/Honeycomb-MTP-sample

पूरे भंडारण हर बार स्कैन नहीं करने के लिए आप का परिणाम बचा सकता है फ़ाइल नाम पढ़ा उदाहरण के लिए हर बार जब आप नए लोगों को खोजने के लिए इसकी जांच करते हैं और इसकी तुलना करते हैं। आमतौर पर फ़ाइल का नामकरण कैमरे पर उसी नंबर से भी शुरू होता है। तो यदि आप एक खाली एसडी कार्ड के साथ एक सत्र शुरू करते हैं तो आप जानते हैं कि फोटो पहले से ही फ़ाइल नाम होगा। आइए img0001.jpg कहें। तो आपको उस फ़ाइल को तब तक पकड़ने के लिए केवल एक फ़ंक्शन लिखने की आवश्यकता है जब तक यह सफल न हो जाए। अगर आप अगले एक img0002.jpg चाहते हैं तो आप सफल होने तक उस फ़ाइल को पकड़ने के लिए एक कार्य/सेवा/फ़ंक्शन लिख सकते हैं, और इसी तरह।

यदि आप बैटरी पर सहेजना चाहते हैं तो आप यूएसबी पोर्ट को पावर करने के लिए अतिरिक्त बैटरी/पावर स्रोत लागू कर सकते हैं।

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

आशा है कि आपको कुछ नए विचार दिए गए

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