बिना नोट के पुराने और नए एपीआई संस्करणों का समर्थन करने के लिए एंड्रॉइड के कैमरा या कैमरा 2 एपीआई का उपयोग कैसे करें?


135

नया कैमरा 2 एपीआई मुझे भ्रमित करता है। मैं एक ऐप विकसित करना चाहता हूं (एंड्रॉइड एपीआई 10 - 21 के लिए) जो डिवाइस के कैमरे का उपयोग करता है। जैसा कि यहां कहा गया है , मुझे "कैमरा" एपीआई का उपयोग करना चाहिए।

हालाँकि, जब मैं "कैमरा" API (android.hardware.Camera) को मैनिफ़ेस्ट के उपयोगकर्ता फीचर्स में जोड़ने का प्रयास करता हूँ , तो इसे पदावनत के रूप में चिह्नित किया जाता है । दूसरी ओर, मैं इसे "कैमरा 2" एपीआई (android.hardware.camera2) में नहीं बदल सकता क्योंकि यह केवल एंड्रॉइड एपीआई 21+ (एंड्रॉइड 5 - लॉलीपॉप) के साथ संगत है - इसे भी लिंक किया होगा, लेकिन मैं केवल जोड़ सकता हूं 2 लिंक।

न केवल मैं चाहता हूं कि मेरा ऐप एंड्रॉइड के पुराने संस्करणों पर चले, बल्कि सबसे नया भी ...

जवाबों:


152

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

आपको Android स्टूडियो की शिकायतों को अनदेखा करने के बारे में अनदेखा करना होगा, लेकिन यदि आप 21 से पहले के Android संस्करणों का समर्थन करना चाहते हैं, तो आपको पुराने API का उपयोग करना होगा।

एपीआई स्तर 21 पर, आप निश्चित रूप से नए एपीआई और इसकी नई सुविधाओं का उपयोग कर सकते हैं, लेकिन वर्तमान में आपको एपीआई के बीच स्विच करने पर अपने ऐप में पूरी तरह से अलग प्रवाह बनाए रखना होगा। दुर्भाग्य से, दो API के पास एक अलग विश्वदृष्टि है जो एक समर्थन पुस्तकालय लिखना मुश्किल है जो आपको पुराने उपकरणों पर नए API जैसे कुछ का उपयोग करने देगा (जहां लाइब्रेरी नए API से पुराने API में मैप करती है यदि नहीं एपीआई 21+ पर)।


1
अच्छा उत्तर। तो अगर आप एपीआई स्तर 16 और ऊपर का समर्थन करना चाहते हैं, तो अभी के लिए पुराने कैमरे से चिपकना बेहतर है?
लूलूई

5
यदि कथन और android.os.Build.VERSION.SDK_INT कोड को अलग करने के लिए उपयोग करने का एकमात्र तरीका है?
हदी

एक डेवलपर के लिए, यदि आप केवल एपीआई 21 को लक्षित कर रहे हैं और बाद में, कैमरा 2 का उपयोग करते हैं, लेकिन यदि आपको कैमरे का उपयोग करने के लिए विरासत समर्थन की आवश्यकता है? या आप अलग-अलग एपीआई का उपयोग करके बिल्ड संस्करणों का पता लगाने और 2 अलग-अलग तरीकों को कोड करने की सिफारिश करेंगे?
john.weland

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

21
कैमरा एपीआई को गलत बताते हुए, उन्हें कैमरा एडवांस्ड एपीआई (पूर्ण विकसित कैमरा ऐप जैसे उन्नत ऐप्स के लिए) पेश करना चाहिए था - अन्यथा (ज्यादातर) ऐप जो केवल तस्वीर लेने के लिए कैमरे का उपयोग करते हैं, उन्हें 2 एपिस बनाए रखना होगा। Google को कम से कम एक कॉम्पैक्ट लाइब्रेरी (हमेशा की तरह) शुरू करनी चाहिए
सुदरा

38

कैमरे से सभी तरीकों को रखो जो आपको एक इंटरफ़ेस में चाहिए और फिर इस तरह से एक कैमरा उदाहरण बनाएं

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Log.d(TAG, "camera2 selected");
        this.camera = new Camera2(getContext());
    } else {
        Log.d(TAG, "camera1 selected");
        this.camera = new Camera1(getContext());
    }

इस तरह आपके पास सब कुछ अलग हो जाएगा और यह आपके जीवन को इतना आसान बना देगा।

सलाह का शब्द - कैमरा 2 के साथ जीवन उतना महान नहीं है। वेंडर अभी भी बकवास क्रियान्वयन करते हैं और आपको इस तरह से बहुत सारी शर्तें और वर्कअराउंड जोड़ना होगा।

उदाहरण 1 - S6 रिपोर्ट है कि यह फ्लैश का समर्थन नहीं करता है :) उदाहरण 2 - एक एलजी डिवाइस समर्थित छवि आकारों की एक सूची की रिपोर्ट करता है - हालांकि उनमें से सभी वास्तव में समर्थित नहीं हैं !!


14
यह सच है। कैमरा 2 एपीआई वास्तव में कैमरा उपकरणों को तीन श्रेणियों में विभाजित करता है: लेगसी, लिमिटेड और फुल। यदि कैमरे को लेगसी के रूप में वर्गीकृत किया गया है, तो सभी कैमरा 2 एपीआई कॉल को हुड के तहत कैमरा 1 में अनुवादित किया जा रहा है, इसलिए यह वास्तव में परेशान करने लायक नहीं है। मेरा सुझाव CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... पुराने एपीआई को कॉल करने और चुनने का है यदि यह सच है।
पनसोकी

9

आप चाहते हैं कि एपीआई का समर्थन करने के लिए, नीचे दिए गए कोड का उपयोग करें। बस उपयुक्त स्तर के अनुरूप नामों का निर्धारण करें। उदाहरण के लिए, API 21 LOLLIPOP है, और API 15 ICE_CREAM_SANDWICH_MR1 है।

 if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)  
                                    && ((Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP))) {
           // your code here - is between 15-21

 } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           // your code here - is api 21
 }

33
यह एक पूर्ण कैमरा कार्यान्वयन के लिए शायद ही व्यावहारिक है। साथ ही, अब आपको दो कोडपाथ बनाए रखने होंगे। संस्करण की जाँच Android विकास में इसका उपयोग किया है, लेकिन यह नहीं है।
katzenhut

5
यदि उपयोगकर्ता Build.VERSION_CODES.LOLLIPOP_MR1 चला रहा है तो क्या होगा? या उससे ऊपर कुछ है? मुझे लगता है कि अपने दूसरे की जांच होना चाहिए कि "यदि किसी और (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
राल्फ पिना

यदि मैं अपने ऐप्स को 16 और नए एपी में काम करना चाहिए, तो मैं एक ही एपीके कैमरा 2 और पुरानी एपीआई में कैसे निर्माण कर सकता हूं? फ्लेवर इस काम के लिए अच्छा है?
मटुस

आपको दोनों एपिस को लागू करना होगा। बस एक इंटरफ़ेस और दो कक्षाएं रखें, जहां कैमरा कार्यक्षमता कार्यान्वित की जाती है। कैमरा चलाने के लिए एक उदाहरण बनाने से पहले, ऊपर बताए गए तरीके से कॉल करें, ताकि यह पता चल सके कि कॉल करने के लिए कौन सी कक्षा और कार्यक्षमता है
user0770

3

हालाँकि, Google क्या सलाह देता है कि Camera2 Api> = 21 का उपयोग करें, लेकिन आपको मैन्युअल सेटिंग में समस्या हो सकती है।

जब आपको ऑटो सेटिंग मोड के साथ फ़ोटो लेने के लिए एप्लिकेशन को लागू करने की आवश्यकता होती है, तो यह ठीक काम करेगा। परंतु! अगर API> = 21 वाले उपकरणों के लिए मैन्युअल सेटिंग मोड कार्यान्वयन के साथ ऐप बनाने की आवश्यकता है, तो सबसे पहले, समर्थित हार्डवेयर स्तर की जाँच करें:

कैमरा (फ्रंट, फेस) चुनें, इसे विशेषताओं को प्राप्त करें और हार्डवेयर स्तर की जांच करें।

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

CameraCharacteristics अगले समर्थित स्तरों का प्रतिनिधित्व करते हैं: सीमित, पूर्ण, कानूनी, LEVEL_3, बाहरी।

एक उच्च स्तर पर, स्तर हैं:

लीगेसी डिवाइस पुराने एंड्रॉइड डिवाइसों के लिए एक बैकवर्ड-संगतता मोड में काम करते हैं, और बहुत सीमित क्षमताएं हैं।

सीमित डिवाइस बेसलाइन फीचर सेट का प्रतिनिधित्व करते हैं, और इसमें अतिरिक्त क्षमताएं भी शामिल हो सकती हैं जो कि FULL के सबसेट हैं।

पूर्ण उपकरण अतिरिक्त रूप से सेंसर, फ्लैश, लेंस और पोस्ट-प्रोसेसिंग सेटिंग्स, और उच्च दर पर छवि कैप्चर के प्रति-फ्रेम मैनुअल नियंत्रण का समर्थन करते हैं।

LEVEL_3 डिवाइस अतिरिक्त आउटपुट स्ट्रीम कॉन्फ़िगरेशन के साथ-साथ YUV रीप्रोसेसिंग और RAW इमेज कैप्चर का समर्थन करते हैं।

यदि आपको लीगेसी सपोट स्तर मिला है, तो आपको पुराने कैमरा एप का उपयोग करना चाहिए ।



0

Plz पढ़ा लिंक कैमरा संस्करण समर्थन वे कहते हैं कि ....
कैमरा API1
Android 5.0 कैमरा अपग्रेड किया गया है, जो कि नए चरण के विकास के रूप में कैमरा API2 पर केंद्रित है। हालाँकि, चरण-आउट अवधि लंबी होगी, और Android रिलीज़ कुछ समय के लिए कैमरा API1 ऐप्स का समर्थन करना जारी रखेगा। विशेष रूप से, समर्थन जारी है:

  • ऐप्स के लिए कैमरा API1 इंटरफेस। कैमरा API1 के शीर्ष पर बनाए गए कैमरा ऐप को काम करना चाहिए क्योंकि वे पहले के एंड्रॉइड रिलीज़ संस्करणों पर चलने वाले उपकरणों पर काम करते हैं।
  • कैमरा एचएएल संस्करण। कैमरा HAL1.0 के लिए समर्थन शामिल है।

  • -1

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

    Intent i;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        i = new Intent(context,camera2.class)
    } else {
        i = new Intent(context,camera.class);
    }
    startActivity(i);

    इस तरह से मुझे कोड को वापस देखने पर भ्रम की स्थिति नहीं होती। कोड को अलग करने के बाद से संशोधित करना आसान है।

    हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
    Licensed under cc by-sa 3.0 with attribution required.