android - एंड्रॉइड-विभिन्न डिवाइसों में गलत अंतराल में कैमरा फ्लैश लाइट ब्लिंकिंग




flash led (3)

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

मैं एक ऐप विकसित कर रहा हूं, जिसमें मैं विशिष्ट अंतराल में फ्लैश लाइट को पलक करना चाहता हूं।

नीचे दिए गए चरणों का मैं पालन कर रहा हूं।

1) विशिष्ट अंतराल के लिए टाइमर सेट करें।

2) run() विधि में मैंने टर्नऑन और टर्नऑफ फ्लैश के लिए कोड किया था।

लेकिन फ्लैश ब्लिंकिंग का अंतराल विभिन्न उपकरणों पर अलग है। टाइमर का समय सभी डिवाइसों के लिए समान है, मैंने एक प्रवेश के बीच भी डाल दिया है, मुझे समान मूल्य मिल रहा है, लेकिन समस्या अभी भी है।

क्या यह एक हार्डवेयर मुद्दा है, क्योंकि हार्डवेयर अलग-अलग डिवाइसों के लिए अलग है मैंने iPhone 5s (आईओएस में उसी कोड को परिवर्तित करके) में भी परीक्षण किया है, लेकिन, फ्लैश ब्लिंकिंग एंड्रॉइड की तुलना में बहुत तेज है।

एंड्रॉइड के लिए मैंने नेक्सस 4, मोटोरोला जी 2, सोनी एक्सपीरिया नियो पर परीक्षण किया है और यह ठीक काम कर रहा है।

समस्या Nexus 5 और सैमसंग गैलेक्सी एस 4 के साथ है।

संपादित करें

टाइमर का कोड:

long delayLong = 200;
long timerValueLong = 500;
Timer timer;

timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        if (!mLightOn) {
            turnOnFlash();
        } else {
            turnOffFlash();
        }
    }
}, delayLong, timerValueLong);

यह एक पुरानी समस्या है, लेकिन समस्या आज भी बनी रहती है इसलिए मैं पोस्ट करूँगा कि मैंने यह कैसे हल किया।

समस्या यह है कि एंड्रॉइड ऑपरेटिंग सिस्टम के माध्यम से आने के लिए कॉल को एलईडी चालू या बंद करने के लिए समय की चर मात्रा में ले जाता है। जिस तरह से इन कॉलों को संभाला जाता है, वे फोन निर्भर होते हैं।

सबसे पहले आप को उस समय को मापने की आवश्यकता होती है जो एलईडी को चालू करने और बंद करने के लिए कॉल करने के समय से शुरू होती है। कैमरे से इनपुट का उपयोग करें, फोन को सतह के पास रखें और फ़्रेम में चमक में बदलाव को मापें। यदि आप OpenGL के साथ काम करते हैं और केंद्र पंक्ति केवल प्रत्येक फ्रेम पढ़ते हैं तो आप glReadPixels का उपयोग कर सकते हैं। आपको कई मापदंडों बनाने की आवश्यकता होगी, क्योंकि ओएस की स्थिति के आधार पर फोन कम या अधिक हो सकता है। अधिमानतः आप कोई बफ़र या फ्रेम के एक निश्चित बफर नहीं चाहते हैं, इसलिए फ़्रेम का समय विश्वसनीय है (जो सम्पीडन के मामले में नहीं हो सकता है) मैंने ओपनजीएल और एक सतह का उपयोग किया और यह एक तेज़ तरीका है

अब आप न्यूनतम (1) और अधिकतम (2) समय के बारे में जानते हैं जो ओएस पर आने के लिए कॉल करता है। इस जानकारी का उपयोग आप फोन पर जितनी जल्दी हो सके एलईडी पलक को बना सकते हैं। वास्तव में इसका सबसे अधिक लाभ उठाने के लिए, अधिकतम (2) समय बीत जाने से पहले दूसरी कॉल फ्लैश शुरू करें; अधिकतम (2) - मिनियम (1)

आखिरी चाल का उपयोग करते हुए, चमकती की गति ज्यादातर कॉल ट्रवर्सल के न्यूनतम और अधिकतम समय में अंतर पर निर्भर होती है। यह आम तौर पर प्रति फोन पर बहुत ही भिन्न होता है, 10 एमएमएस से 100 एमएमएस +

यह भी ध्यान रखें कि क्योंकि कॉल ट्रैवर्सल का समय मापने के साथ कैमरे के साथ होता है, कई बार 33ms सेगमेंट (@ 30 एफपीएस) तक गोल हो जाते हैं


    long delayLong = 20;
    long timerValueLong = 100;
    Timer timer;
    final Parameters p = camera.getParameters();
    timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            if (!isLighOn) {
                p.setFlashMode(Parameters.FLASH_MODE_ON);
                p.setFlashMode(Parameters.FLASH_MODE_TORCH);
                camera.setParameters(p);
                isLighOn = true;
            } else {
                p.setFlashMode(Parameters.FLASH_MODE_OFF);
                camera.setParameters(p);
                isLighOn = false;
            }
        }
    }, delayLong, timerValueLong);






led