5

मैं मार्शमलो फिंगरप्रिंट प्रमाणीकरण API के साथ शुरुआत करना चाहता हूं। मैं समझता हूँ कि अनुमति के लिए पूछने के लिए, मैं निम्न विधि का उपयोग करना होगा:मार्शमलो फिंगरप्रिंट स्कैनर हार्डवेयर उपस्थिति

ContextCompat.checkSelfPermission(getContext(), Manifest.permission.USE_FINGERPRINT); 

और डिवाइस एपीआई स्तर 23 या इससे अधिक चल रहा है तो मैं जांच करना चाहिए। लेकिन इससे पहले कि मैं अनुमति मांगूं, मैं यह जांचना चाहूंगा कि डिवाइस में वास्तव में एक फिंगरप्रिंट स्कैनर है या नहीं। मैं निम्नलिखित दो तरीकों पाया इस चेक करने के लिए:

FingerprintManager manager = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE); 

manager.isHardwareDetected(); 

manager.hasEnrolledFingerprints(); 

लेकिन दोनों तरीकों USE_FINGERPRINT अनुमति की आवश्यकता सभी को कहा जाता है। मैं एक फिंगरप्रिंट स्कैनर का उपयोग करने की अनुमति क्यों मांगूंगा जिसके बारे में मुझे पता भी नहीं है? क्या स्कैनर मौजूद है या नहीं, यह जानने के लिए कोई और तरीका है? या अनुमति के लिए पहले पूछने का एकमात्र तरीका है?

+1

'USE_FINGERPRINT' एक सामान्य अनुमति है - एक बार यह अपने मेनिफ़ेस्ट में है आप हमेशा यह करना होगा और आप()' ContextCompat.checkSelfPermission उपयोग करने के लिए की जरूरत नहीं है '। – ianhanniballake

+0

@ianhanniballake ओह, यह सच लगता है। फिर यह 'सुरक्षा अपवाद' क्यों फेंक देगा? क्या यह सिर्फ एक कंपाइलर त्रुटि या कुछ नहीं होना चाहिए? 'VIBRATOR_SERVICE' के लिए सामान्य अनुमति भी आवश्यक है, और यह कोई अपवाद नहीं फेंकता है। – Bryan

उत्तर

9

मैं सिर्फ वर्ग FingerprintManagerCompat पाया है, जो करता है आप वास्तव में क्या उम्मीद करेंगे:

एक वर्ग है कि अंगुली की छाप हार्डवेयर के लिए उपयोग समन्वय करता है।

एम से पहले प्लेटफॉर्म पर, यह वर्ग व्यवहार करता है क्योंकि कोई फिंगरप्रिंट हार्डवेयर उपलब्ध नहीं होगा। इस वर्ग में FingerprintManager से

एक ही तरीके का USE_FINGERPRINT अनुमति की आवश्यकता नहीं है, इससे पहले कि आप USE_FINGERPRINT अनुमति के लिए पूछने आप उन्हें फोन करने के लिए सक्षम करने से।

FingerprintManagerCompat manager = FingerprintManagerCompat.from(mContext); 

manager.isHardwareDetected(); 
manager.hasEnrolledFingerprints(); 

ये विधियां पूर्व-मार्शमलो उपकरणों पर अपेक्षित झूठे परिणाम भी प्राप्त करेंगी।

4

Try hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)PackageManager उदाहरण पर (आप किसी भी Context पर getPackageManager() पर कॉल करने से प्राप्त कर सकते हैं)।

+0

यह आशाजनक प्रतीत होता है, लेकिन इस विधि को एपीआई स्तर 23 की आवश्यकता नहीं होने पर मुझे थोड़ा सावधान रहा है। यदि डिवाइस में प्री-मार्शमलो स्कैनर (सैमसंग डिवाइस पर) कहें तो यह सच हो जाएगा, या स्कैनर जो अंतःक्रियाशील नहीं है फिंगरप्रिंट प्रमाणीकरण API के साथ? यदि ऐसा है, तो उन उपकरणों पर मैं एक ही परिस्थिति में रहूंगा जो मैं अभी में हूं। – Bryan

+1

@ ब्रायन: "मैं थोड़ा सावधान हूं क्योंकि इस विधि को एपीआई स्तर 23 की आवश्यकता नहीं है" - विधि नहीं है, लेकिन 'FEATURE_FINGERPRINT' करता है। केवल इसे API स्तर 23+ डिवाइस पर कॉल करें; मुझे नहीं पता कि क्या होता है यदि आप एक अज्ञात फीचर नाम में 'हैसिस्टमफेचर() 'में जाते हैं। – CommonsWare

+1

@ ब्रायन: "या एक स्कैनर जो फिंगरप्रिंट प्रमाणीकरण API के साथ अंतःक्रियाशील नहीं है?" - वह, मैं नहीं कह सकता। यही है कि 'फ़िंगरप्रिंट प्रबंधक' विधियां हैं। आपका उद्देश्य उन मामलों को फ़िल्टर करना चाहिए जहां आपको स्पष्ट रूप से 'USE_FINGERPRINT' अनुमति की आवश्यकता नहीं है। यदि यह कल्पना की जा सकती है कि आपके पास फिंगरप्रिंट क्षमता है, तो अनुमति मांगें और 'फ़िंगरप्रिंट प्रबंधक' के साथ उपलब्धता की पुन: पुष्टि करें। – CommonsWare

1

FingerprintManager वर्ग Android उपकरणों एपीआई 23 या उच्चतर पर चल रहा है का समर्थन करता है और कम Android संस्करण चलाने वाले डिवाइस पर एक अपवाद फेंकता है।

FingerprintManagerCompat वर्ग कम Android संस्करण में isHardwareDetected विधि का पश्चगामी संगतता दे लेकिन यह हमेशा एपीआई 23 या उच्चतर

मैं दोनों का सबसे अच्छा उठाया और इस विधि बनाया फ़िंगरप्रिंट सेंसर हार्डवेयर के लिए जाँच करने के लिए झूठे रिटर्न सभी एंड्रॉइड संस्करण में समर्थन।

private boolean isSensorAvialable() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      return ActivityCompat.checkSelfPermission(AppContext, Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED && 
        AppContext.getSystemService(FingerprintManager.class).isHardwareDetected(); 
     } else { 
      return FingerprintManagerCompat.from(AppContext).isHardwareDetected(); 
     } 
    } 
संबंधित मुद्दे