मास्टर एंड्रॉइड के सेंसर: हार्डवेयर, सॉफ्टवेयर और बहुआयामी

लेखक: John Stephens
निर्माण की तारीख: 26 जनवरी 2021
डेट अपडेट करें: 5 जुलाई 2024
Anonim
मास्टर एंड्रॉइड के सेंसर: हार्डवेयर, सॉफ्टवेयर और बहुआयामी - क्षुधा
मास्टर एंड्रॉइड के सेंसर: हार्डवेयर, सॉफ्टवेयर और बहुआयामी - क्षुधा

विषय


आज, अधिकांश आधुनिक एंड्रॉइड उपकरणों को सेंसर के एक गुच्छा के साथ बाहर रखा गया है।

आप इस जानकारी का उपयोग विभिन्न तरीकों से कर सकते हैं - चाहे वह प्रकाश के स्तर की निगरानी कर रहा हो, ताकि आपका एप्लिकेशन अपनी चमक या रंग योजना को स्वचालित रूप से समायोजित कर सके; उपयोगकर्ता को अपने मोबाइल गेम के साथ बातचीत करने की अनुमति देता है जैसे इशारों का उपयोग करके उनके डिवाइस को झुकाना; जब भी उपयोगकर्ता अपने डिवाइस को अपने कान पर रखता है, तब स्पर्श घटनाओं को स्वचालित रूप से अक्षम करने के लिए निकटता सेंसर का उपयोग करना।

इस लेख में, हम तीन अनुप्रयोगों का निर्माण करते हैं जो हार्डवेयर और सॉफ्टवेयर सेंसर की एक श्रेणी से प्रकाश, निकटता और गति डेटा प्राप्त करते हैं। हम इन एंड्रॉइड सेंसर को वास्तविक समय में भी मॉनिटर करेंगे, इसलिए आपके एप्लिकेशन में हमेशा नवीनतम जानकारी तक पहुंच होती है।

इस लेख के अंत तक, आपको पता चल जाएगा कि एंड्रॉइड सेंसर से डेटा का एक टुकड़ा कैसे निकालना है, और उन सेंसर को कैसे संभालना है जो अपने डेटा को बहुआयामी सरणी के रूप में प्रदान करते हैं।

मैं किस एंड्रॉइड सेंसर का उपयोग कर सकता हूं?

Android सेंसर को निम्न श्रेणियों में विभाजित किया जा सकता है:


  • पर्यावरण सेंसर। ये पर्यावरण की स्थिति को मापते हैं, जैसे हवा का तापमान, दबाव, आर्द्रता और परिवेश प्रकाश स्तर।

  • स्थिति सेंसर। इस श्रेणी में वे सेंसर शामिल हैं जो डिवाइस की भौतिक स्थिति को मापते हैं, जैसे निकटता सेंसर और भू-चुंबकीय क्षेत्र सेंसर।
    मोशन सेंसर। ये सेंसर डिवाइस मोशन को मापते हैं, और इसमें एक्सीलरोमीटर, ग्रेविटी सेंसर, जायरोस्कोप और रोटेशन वेक्टर सेंसर शामिल हैं।

इसके अलावा, सेंसर या तो हो सकते हैं:

  • हार्डवेयर आधारित है। ये भौतिक घटक हैं जो डिवाइस में निर्मित होते हैं और सीधे विशिष्ट गुणों को मापते हैं, जैसे त्वरण या आसपास के भू-चुंबकीय क्षेत्रों की ताकत।
  • सॉफ्टवेयर आधारित, जिसे कभी-कभी आभासी सेंसर या समग्र सेंसर के रूप में जाना जाता है। ये आमतौर पर कई हार्डवेयर-आधारित सेंसर से डेटा टकराते हैं। इस लेख के अंत में, हम रोटेशन वेक्टर सेंसर के साथ काम कर रहे हैं, जो एक सॉफ्टवेयर सेंसर है जो डिवाइस के एक्सेलेरोमीटर, मैग्नेटोमीटर और जाइरोस्कोप से डेटा को जोड़ता है।

पर्यावरण सेंसर: परिवेश प्रकाश को मापने

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


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

अपनी पसंद की सेटिंग के साथ एक नया एंड्रॉइड प्रोजेक्ट बनाएं, और शुरू होने दें!

अपने सेंसर डेटा को प्रदर्शित करना

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

अपनी परियोजना की गतिविधि_main.xml फ़ाइल खोलें, और निम्नलिखित जोड़ें:

इसके बाद, हमें "light_sensor" स्ट्रिंग संसाधन बनाने की आवश्यकता है जो हमारे लेआउट में संदर्भित है। अपनी परियोजना के तार खोलें। xml फ़ाइल, और निम्नलिखित जोड़ें:

लाइट सेंसर:% 1 $ .2f

"% 1 $ .2f" एक प्लेसहोल्डर है जो उस सूचना को निर्दिष्ट करता है जिसे हम प्रदर्शित करना चाहते हैं, और यह कैसे स्वरूपित होना चाहिए:

  • %1. आप एक ही स्ट्रिंग संसाधन में कई प्लेसहोल्डर सम्मिलित कर सकते हैं; "% 1" इंगित करता है कि हम एक एकल प्लेसहोल्डर का उपयोग कर रहे हैं।
  • $.2. यह निर्दिष्ट करता है कि हमारे आवेदन को प्रत्येक आने वाले फ़्लोटिंग-पॉइंट मान को कैसे प्रारूपित करना चाहिए। "$ .2" इंगित करता है कि मूल्य को दो दशमलव स्थानों पर गोल किया जाना चाहिए।
  • एफ मान को फ़्लोटिंग-पॉइंट संख्या के रूप में स्वरूपित करें।

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

आप यह देख सकते हैं कि क्या कोई विशेष सेंसर किसी डिवाइस पर मौजूद है, Android सेंसर फ्रेमवर्क का उपयोग करके। फिर आप सेंसर की उपलब्धता के आधार पर अपने एप्लिकेशन के कुछ हिस्सों को अक्षम या सक्षम कर सकते हैं, या आप यह समझाते हुए प्रदर्शित कर सकते हैं कि आपके एप्लिकेशन की कुछ विशेषताओं ने अपेक्षा के अनुरूप काम नहीं किया है।

जब हमारे पास हमारी स्ट्रिंग। Xml फ़ाइल खुली हो, तो एक "no_sensor" स्ट्रिंग बनाएँ, जिसे हम तब प्रदर्शित करेंगे जब लाइट सेंसर अनुपलब्ध हो:

कोई लाइट सेंसर उपलब्ध नहीं है

यदि आपका एप्लिकेशन किसी विशेष सेंसर तक पहुंच के बिना एक अच्छा उपयोगकर्ता अनुभव प्रदान नहीं कर सकता है, तो आपको इस जानकारी को अपने घोषणापत्र में जोड़ने की आवश्यकता है। उदाहरण के लिए, यदि आपके एप्लिकेशन को कम्पास सेंसर तक पहुंच की आवश्यकता है, तो आप निम्न का उपयोग कर सकते हैं:

अब, आपका ऐप केवल उन्हीं डिवाइसों पर डाउनलोड किया जा सकता है जिनमें कंपास सेंसर है।

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

सेंसर के साथ संचार करना: SensorManager, SensorEvents, और श्रोता

डिवाइस के लाइट सेंसर के साथ संवाद करने के लिए, आपको निम्नलिखित चरणों को पूरा करना होगा:

1. SensorManager का एक उदाहरण प्राप्त करें

SensorManager डिवाइस के सेंसर की पूरी श्रृंखला तक पहुँचने के लिए आवश्यक सभी विधियाँ प्रदान करता है।

शुरू करने के लिए, एक चर बनाएं जो SensorManager का एक उदाहरण रखता है:

निजी SensorManager lightSensorManager;

फिर, आपको Context.getSystemService विधि को कॉल करके और Context.SENSOR_SERVICE तर्क में पास करके SensorManager का एक उदाहरण प्राप्त करना होगा:

lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE);

2. lightTextView का संदर्भ लें

इसके बाद, हमें एक निजी सदस्य वैरिएबल बनाने की जरूरत है, जो हमारे TextView ऑब्जेक्ट्स को रखेगा, और हमारे TextView को असाइन करेगा:

निजी TextView lightTextView; ... ... ... lightTextView = (TextView) findViewById (R.id.lightTextView);

3. जांचें कि क्या सेंसर वर्तमान डिवाइस पर मौजूद है

आप getDefaultSensor () विधि को कॉल करके किसी विशेष सेंसर तक पहुंच प्राप्त कर सकते हैं, और फिर इसे सेंसर को प्रश्न में पास कर सकते हैं। प्रकाश संवेदक के लिए स्थिर प्रकार TYPE_LIGHT है, इसलिए हमें निम्नलिखित का उपयोग करने की आवश्यकता है:

lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT);

यदि इस उपकरण पर सेंसर मौजूद नहीं है, तो getDefaultSensor () विधि शून्य हो जाएगी, और हम "no_sensor" स्ट्रिंग प्रदर्शित करेंगे:

स्ट्रिंग Sens_error = getResources ()। GetString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (Sens_error); }}

4. अपने सेंसर श्रोताओं को पंजीकृत करें

हर बार एक सेंसर में नया डेटा होता है, Android एक SensorEvent ऑब्जेक्ट बनाता है। इस SensorEvent ऑब्जेक्ट में इवेंट, टाइमस्टैम्प और नया डेटा मान उत्पन्न करने वाला सेंसर शामिल है।

प्रारंभ में, हम प्रकाश और निकटता सेंसर पर ध्यान केंद्रित कर रहे हैं, जो डेटा का एक टुकड़ा लौटाते हैं। हालांकि, कुछ सेंसर रोटेशन सेंसर वेक्टर सहित प्रत्येक SensorEvent के लिए बहुआयामी सरणियाँ प्रदान करते हैं, जिन्हें हम इस लेख के अंत में खोज रहे हैं।

यह सुनिश्चित करने के लिए कि हमारा आवेदन इन SensorEvent वस्तुओं के बारे में अधिसूचित है, हमें SensorManager के रजिस्टरलिस्ट () का उपयोग करके उस विशिष्ट सेंसर घटना के लिए एक श्रोता को पंजीकृत करना होगा।

RegisterListener () विधि निम्नलिखित तर्क लेती है:

  • एक ऐप या गतिविधि संदर्भ।
  • सेंसर का प्रकार जिसे आप मॉनिटर करना चाहते हैं।
  • वह दर जिस पर सेंसर को नया डेटा भेजना चाहिए। उच्च दर आपके एप्लिकेशन को अधिक डेटा प्रदान करेगी, लेकिन यह अधिक सिस्टम संसाधनों, विशेषकर बैटरी जीवन का भी उपयोग नहीं करेगा। डिवाइस की बैटरी को संरक्षित करने में मदद करने के लिए, आपको उस डेटा की न्यूनतम मात्रा का अनुरोध करना चाहिए जो आपके आवेदन की आवश्यकता है। मैं SensorManager.SENSOR_DELAY_NORMAL का उपयोग करने जा रहा हूं, जो हर 200,000 माइक्रोसेकंड (0.2 सेकंड) में एक बार नया डेटा भेजता है।

चूंकि सेंसर डिवाइस की बैटरी को सूखा देता है, इसलिए आपको अपने एप्लिकेशन की ऑनक्रिएट () विधि में श्रोताओं को कभी भी पंजीकृत नहीं करना चाहिए, क्योंकि इससे सेंसर डेटा भेजना जारी रखेंगे, भले ही आपका एप्लिकेशन बैकग्राउंड में हो।

इसके बजाय, आपको अपने सेंसर को एप्लिकेशन के ऑनस्टार्ट () जीवन चक्र विधि में पंजीकृत करना चाहिए:

@Override संरक्षित शून्य onStart () {super.onStart (); // यदि सेंसर चालू डिवाइस पर उपलब्ध है ... // अगर (लाइटसेंसर! = Null) {//…। तो सुनना शुरू करें // lightSensorManager.registerListener (यह, lightSensor, SensorManager.ENSOR_DELAY_NORMAL); }}

5. SensorEventListener कॉलबैक को लागू करें

SensorEventListener एक इंटरफ़ेस है जो SensorManager से सूचनाएं प्राप्त करता है
जब भी नया डेटा उपलब्ध होता है, या सेंसर की सटीकता बदल जाती है।

पहला कदम, SensorEventListener इंटरफ़ेस को लागू करने के लिए हमारे वर्ग हस्ताक्षर को संशोधित कर रहा है:

सार्वजनिक वर्ग MainActivity का विस्तार AppCompatActivity लागू करता है SensorEventListener {

फिर हमें निम्नलिखित कॉलबैक विधियों को लागू करने की आवश्यकता है:

onSensorChanged ()

इस विधि को प्रत्येक नए SensorEvent के जवाब में कहा जाता है।

सेंसर डेटा अक्सर तेजी से बदल सकता है, इसलिए आपका एप्लिकेशन onSensorChanged () विधि को नियमित रूप से कॉल कर सकता है। अपने एप्लिकेशन को सुचारू रूप से चलाने में मदद करने के लिए, आपको ऑनसेंसरचेंज () विधि के तहत जितना संभव हो उतना कम काम करना चाहिए।

@Override सार्वजनिक शून्य onSensorChanged (SensorEvent SensEvent) {// करने के लिए //}

onAccuracyChanged ()

यदि सेंसर की सटीकता में सुधार या गिरावट आती है, तो एंड्रॉइड onAccuracyChanged () विधि को कॉल करेगा और इसे एक सेंसर ऑब्जेक्ट पास करेगा जिसमें नए सटीकता मूल्य होंगे, जैसे कि SENSOR_STATUS_UNRELIABLE या BENSOR_STATUS_ACCURACY_HIGH।

प्रकाश संवेदक सटीकता की रिपोर्ट नहीं करता है, इसलिए मैं onAccuracyChanged () कॉलबैक खाली छोड़ दूंगा:

@ ओवरराइड सार्वजनिक शून्य onAccuracyChanged (सेंसर सेंसर, int i) {// To do //}}

6. सेंसर मान को पुनः प्राप्त करें

जब भी हमारे पास एक नया मूल्य होता है, तो हमें onSensorChanged () विधि को कॉल करने की आवश्यकता होती है, और "light_sensor" स्ट्रिंग पुनः प्राप्त करते हैं। फिर हम स्ट्रिंग के प्लेसहोल्डर टेक्स्ट (% 1 $ .2f) को ओवरराइड कर सकते हैं और अपडेट किए गए स्ट्रिंग को हमारे टेक्स्ट व्यू के हिस्से के रूप में प्रदर्शित कर सकते हैं:

@Override सार्वजनिक शून्य onSensorChanged (SensorEvent SensEvent) {// सेंसर का वर्तमान मान // फ़्लोट करेंटवैल्यू = SensEvent.values; // "light_sensor" स्ट्रिंग को पुनः प्राप्त करें, नया मान डालें और इसे उपयोगकर्ता को प्रदर्शित करें // lightTextView.setText (getResources ()। GetString (R.string.light_sensor, currentcalue)); }

7. अपने श्रोताओं को अपंजीकृत करें

सेंसर कम मात्रा में बड़ी मात्रा में डेटा उत्पन्न कर सकते हैं, इसलिए डिवाइस के संसाधनों को संरक्षित करने में मदद करने के लिए आपको अपने श्रोताओं को अपंजीकृत करने की आवश्यकता होगी जब उन्हें अब आवश्यकता नहीं है।

जब आपका एप्लिकेशन बैकग्राउंड में हो, तो सेंसर ईवेंट के लिए सुनना बंद कर दें, अपने प्रोजेक्ट के onStop () जीवन चक्र विधि में unregisterListener () जोड़ें:

@Override संरक्षित शून्य onStop () {super.onStop (); lightSensorManager.unregisterListener (this); }

ध्यान दें कि आपको अपने श्रोताओं को ऑनपॉज़ () में नहीं देखना चाहिए, क्योंकि एंड्रॉइड 7.0 में और उच्चतर एप्लिकेशन विभाजित-स्क्रीन और पिक्चर-इन-पिक्चर मोड में चल सकते हैं, जहां वे रुके हुए अवस्था में हैं, लेकिन स्क्रीन पर दिखाई नहीं देते।

Android के प्रकाश सेंसर का उपयोग करना: पूर्ण कोड

उपरोक्त सभी चरणों को पूरा करने के बाद, आपकी परियोजना की MainActivity कुछ इस तरह दिखनी चाहिए:

import android.support.v7.app.AppCompatActivity; आयात android.os.Bundle; आयात android.content.Context; आयात android.hardware.Sensor; आयात android.hardware.SensorEvent; आयात android.hardware.SensorEventListener; आयात android.hardware.SensorManager; आयात android.widget.TextView; सार्वजनिक वर्ग MainActivity फैली हुई है AppCompatActivity // SensorEventListener इंटरफ़ेस लागू करें // औजार SensorEventListener {// अपने चर बनाएं / निजी सेंसर lightSensor; निजी SensorManager lightSensorManager; निजी TextView lightTextView; @Override संरक्षित शून्य onCreate (बंडल सहेजी गई InstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); lightTextView = (TextView) findViewById (R.id.lightTextView); // SensorManager का एक उदाहरण प्राप्त करें // lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // एक प्रकाश संवेदक की जाँच करें // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT); // यदि प्रकाश सेंसर मौजूद नहीं है, तो एक त्रुटि प्रदर्शित करें। स्ट्रिंग सेंसर_रोर = getResource ()। GetString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (Sens_error); }} @Override संरक्षित शून्य onStart () {super.onStart (); // यदि सेंसर चालू डिवाइस पर उपलब्ध है ... // अगर (लाइटसेंसर! = नल) {//.तो एक श्रोता को पंजीकृत करें // lightSensorManager.registerListener (यह, lightSensor, // निर्दिष्ट करें कि आप कितनी बार चाहते हैं नया डेटा प्राप्त करें // SensorManager.SENSOR_DELAY_NORMAL); }} @Override संरक्षित शून्य onStop () {super.onStop (); // अपने श्रोता को अपंजीकृत करें // lightSensorManager.unregisterListener (यह); } @Override सार्वजनिक शून्य onSensorChanged (SensorEvent SensEvent) {// सेंसर का वर्तमान मान // फ़्लोट करेंटवैल्यू = SensEvent.values; // "light_sensor" स्ट्रिंग को पुनः प्राप्त करें, नया मान डालें और TextView // lightTextView.setText (getResources ()। GetString (R.string.light_sensor, currentVinue)) को अपडेट करें; } @ ऑवरराइड // यदि सेंसर की सटीकता बदल जाती है… .// सार्वजनिक शून्य onAccuracyChanged (सेंसर सेंसर, int i) {// TO DO //}}

अपने पूर्ण Android सेंसर ऐप का परीक्षण करें

इस एप्लिकेशन को एक भौतिक एंड्रॉइड स्मार्टफोन या टैबलेट पर परीक्षण करने के लिए:

  • अपने डिवाइस पर प्रोजेक्ट स्थापित करें (Android स्टूडियो टूलबार से "रन> रन" का चयन करके)।
  • यद्यपि यह उपकरणों के बीच भिन्न होता है, प्रकाश संवेदक अक्सर स्क्रीन के ऊपरी-दाएं पर स्थित होता है। प्रकाश स्तरों में हेरफेर करने के लिए, अपने डिवाइस को करीब ले जाएं, और फिर एक प्रकाश स्रोत से दूर। वैकल्पिक रूप से, आप प्रकाश को अवरुद्ध करने के लिए, अपने हाथ से डिवाइस को कवर करने का प्रयास कर सकते हैं। उपलब्ध लाइट की मात्रा के आधार पर "लाइट सेंसर" मूल्य में वृद्धि और कमी होनी चाहिए।

यदि आप एंड्रॉइड वर्चुअल डिवाइस (AVD) का उपयोग कर रहे हैं, तो एमुलेटर में वर्चुअल सेंसर नियंत्रण का एक सेट है जिसे आप विभिन्न सेंसर घटनाओं का अनुकरण करने के लिए उपयोग कर सकते हैं। आप एमुलेटर के "एक्सटेंडेड कंट्रोल्स" विंडो के माध्यम से इन वर्चुअल सेंसर कंट्रोल को एक्सेस करते हैं:

  • अपने AVD पर एप्लिकेशन इंस्टॉल करें।
  • AVD के साथ, आपको बटन की एक पट्टी दिखाई देगी। तीन-डॉटेड "अधिक" बटन ढूंढें (जहां कर्सर निम्नलिखित स्क्रीनशॉट में तैनात है) और इसे क्लिक करें। यह "विस्तारित नियंत्रण" विंडो लॉन्च करता है।

  • बाएं हाथ के मेनू में, "वर्चुअल सेंसर" चुनें।
  • "अतिरिक्त सेंसर" टैब चुनें। इस टैब में विभिन्न स्लाइडर्स होते हैं जिनका उपयोग आप विभिन्न स्थिति और पर्यावरण सेंसर घटनाओं का अनुकरण करने के लिए कर सकते हैं।

  • "लाइट (लक्स)" स्लाइडर ढूंढें और नकली प्रकाश स्तरों को बदलने के लिए इसे बाएं और दाएं खींचें। आपके एप्लिकेशन को इन बदलते मूल्यों को वास्तविक समय में प्रदर्शित करना चाहिए।

आप पूरा प्रोजेक्ट GitHub से डाउनलोड कर सकते हैं।

एंड्रॉइड के निकटता सेंसर के साथ दूरी को मापना

अब हमने यह देखा है कि पर्यावरणीय सेंसर से जानकारी कैसे प्राप्त की जाए, आइए देखें कि आप इस ज्ञान को कैसे लागू करते हैं स्थान सेंसर।

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

उपयोगकर्ता इंटरफ़ेस बनाना

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

इसके बाद, अपने स्ट्रिंग्स.xml फ़ाइल को खोलें और एक "निकटता_ सेंसर" स्ट्रिंग बनाएं। एक बार फिर, इस स्ट्रिंग में एक प्लेसहोल्डर होना चाहिए, जो अंततः निकटता सेंसर से निकाले गए डेटा द्वारा पॉपुलेट किया जाएगा:

मौजूदगी पता लगाने वाला सेंसर निकटता सेंसर:% 1 $ .2f कोई निकटता सेंसर उपलब्ध नहीं है

निकटता सेंसर से डेटा प्राप्त करना

प्रकाश संवेदक के समान, एंड्रॉइड के निकटता संवेदक एक एकल डेटा मान देता है, जिसका अर्थ है कि हम अपने पिछले एप्लिकेशन से बहुत सारे कोड का पुन: उपयोग कर सकते हैं। हालाँकि, कुछ प्रमुख अंतर हैं, साथ ही कुछ नाम-संबंधित परिवर्तन जो इस कोड का अनुसरण करना आसान बनाते हैं:

  • SensorManager का एक उदाहरण बनाएँ, जो इस बार मैं "निकटताSensorManager" के नाम पर जा रहा हूँ।
  • "निकटता का पता लगाएं। निकटता प्रबंधक"
  • "निकटताTextView" के लिए एक संदर्भ बनाएँ।
  • GetDefaultSensor () विधि को कॉल करें, और इसे TYPE_PROXIMITY सेंसर पास करें।
  • निकटता सेंसर के लिए श्रोताओं को पंजीकृत और अपंजीकृत करें।

इन ट्वीक्स को बनाने के बाद, आपको निम्नलिखित बातों का ध्यान रखना चाहिए:

import android.support.v7.app.AppCompatActivity; आयात android.os.Bundle; आयात android.content.Context; आयात android.hardware.Sensor; आयात android.hardware.SensorEvent; आयात android.hardware.SensorManager; आयात android.hardware.SensorEventListener; आयात android.widget.TextView; सार्वजनिक वर्ग MainActivity फैली हुई है AppCompatActivity // SensorEventListener इंटरफ़ेस लागू करें // औजार SensorEventListener {// अपने चर बनाएं / निजी सेंसर निकटतासेंसर; निजी सेंसर प्रबंधक निकटता निजी टेक्स्ट दृश्य निकटताTextView; @Override संरक्षित शून्य onCreate (बंडल सहेजी गई InstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); निकटताTextView = (पाठ दृश्य) findViewById (R.id.pro निकटताTextView); // SensorManager का एक उदाहरण प्राप्त करें // निकटताSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); एक निकटता सेंसर के लिए जाँच करें // निकटता सेंसर = निकटताSensorManager.getDefaultSensor (Sensor.TYPE_PROXIMITY); // यदि निकटता सेंसर मौजूद नहीं है, तो एक त्रुटि प्रदर्शित करें // स्ट्रिंग सेंसर_रोर = getResources ()। GetString (R.string.no_sensor); अगर (निकटता सेंसर == अशक्त) {निकटताTextView.setText (Sens_error); }} @Override संरक्षित शून्य onStart () {super.onStart (); // यदि सेंसर चालू डिवाइस पर उपलब्ध है ... // अगर (निकटता सेंसर) = null) {//. तो एक श्रोता पंजीकृत करें // निकटताSensorManager.registerListener (यह, निकटता सेंसर, // निर्दिष्ट करें कि आप कितनी बार चाहते हैं नया डेटा प्राप्त करें // SensorManager.SENSOR_DELAY_NORMAL); }} @Override संरक्षित शून्य onStop () {super.onStop (); // सिस्टम श्रोताओं को संरक्षित करने के लिए अपने श्रोता को अपंजीकृत करें। } @Override सार्वजनिक शून्य onSensorChanged (SensorEvent SensEvent) {// सेंसर का वर्तमान मान // फ़्लोट करेंटवैल्यू = SensEvent.values; // "निकटता_सेंसर" स्ट्रिंग को पुनः प्राप्त करें, नया मान डालें और TextView // निकटताTextView.setText (getResources ()। GetString (R.string.pro निकटता_sensor, currentcalue) को अपडेट करें; } @Override // यदि सेंसर की सटीकता बदल जाती है… .// सार्वजनिक शून्य onAccuracyChanged (सेंसर सेंसर, int i) {//...TO DO //}}

परीक्षण: उपयोगकर्ता अपने डिवाइस के कितने करीब है?

इस एप्लिकेशन को एक भौतिक एंड्रॉइड स्मार्टफोन या टैबलेट पर परीक्षण के लिए रखने के लिए, अपने डिवाइस पर एप्लिकेशन इंस्टॉल करें और फिर स्क्रीन की ओर अपना हाथ बढ़ाकर प्रयोग करें और फिर इसे फिर से दूर ले जाएं। "निकटता सेंसर" मान को आपकी गतिविधियों को रिकॉर्ड करना चाहिए।

बस ध्यान रखें कि निकटता सेंसर उपकरणों के बीच भिन्न हो सकते हैं। कुछ उपकरण केवल दो निकटता मान प्रदर्शित कर सकते हैं - एक "निकट" और "सुदूर" इंगित करने के लिए - यदि आप अपने भौतिक Android डिवाइस पर बहुत विविधता नहीं देखते हैं तो आश्चर्यचकित न हों।

एमुलेटर पर इस एप्लिकेशन का परीक्षण करने के लिए:

  • एक AVD पर अपना एप्लिकेशन इंस्टॉल करें।
  • तीन-डॉटेड "अधिक" बटन ढूंढें और इसे एक क्लिक दें, जो "विस्तारित नियंत्रण" विंडो लॉन्च करता है।
  • विंडो के बाएँ हाथ के मेनू में, "वर्चुअल सेंसर" चुनें।
  • "अतिरिक्त सेंसर" टैब चुनें।
  • "निकटता" स्लाइडर ढूंढें, और डिवाइस के करीब जाने वाली किसी वस्तु का अनुकरण करने के लिए इसे बाएं और दाएं खींचें, और फिर आगे दूर। स्लाइडर को हेरफेर करने पर "निकटता सेंसर" मान बदल जाने चाहिए।

आप पूरा प्रोजेक्ट GitHub से डाउनलोड कर सकते हैं।

मोशन सेंसर: प्रसंस्करण बहुआयामी सरणियों

इस बिंदु तक, हम उन सेंसरों पर ध्यान केंद्रित करते हैं जो डेटा के एक आइटम की आपूर्ति करते हैं, लेकिन कुछ सेंसर ऐसे हैं जो प्रत्येक सेंसर के लिए बहुआयामी सरणियाँ प्रदान करते हैं। इन बहुआयामी सेंसर में मोशन सेंसर शामिल हैं, जिन्हें हम इस अंतिम खंड पर ध्यान केंद्रित करेंगे।

मोशन सेंसर आपकी मदद कर सकते हैं:

  • उपयोगकर्ता इनपुट का एक वैकल्पिक तरीका प्रदान करें। उदाहरण के लिए, यदि आप एक मोबाइल गेम विकसित कर रहे हैं तो उपयोगकर्ता अपने डिवाइस को झुकाकर स्क्रीन के चारों ओर अपने चरित्र को स्थानांतरित कर सकता है।
  • उपयोगकर्ता गतिविधि को सुरक्षित करें। यदि आपने एक गतिविधि-ट्रैकिंग ऐप बनाया है, तो गति सेंसर आपको यह पता लगाने में मदद कर सकते हैं कि उपयोगकर्ता कार में यात्रा कर रहा है, जॉगिंग कर रहा है, या उनके डेस्क पर बैठा है।
  • अधिक सटीक रूप से अभिविन्यास निर्धारित करते हैं।डिवाइस की गति अभिविन्यास में सबसे सटीक जानकारी प्राप्त करने के लिए, डिवाइस के मोशन सेंसर से निर्देशांक निकालना और फिर पृथ्वी के समन्वय प्रणाली के आधार पर उनका अनुवाद करना संभव है।

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

हम एक ऐसा एप्लिकेशन बना रहे हैं जो मापने के लिए रोटेशन वेक्टर सेंसर का उपयोग करता है:

  • पिच। यह डिवाइस का शीर्ष-से-नीचे झुकाव है।
  • रोल। यह डिवाइस के बाएं से दाएं झुकाव है।

वास्तविक समय पिच और रोल डेटा प्रदर्शित करना

चूंकि हम दो मीट्रिक माप रहे हैं, इसलिए हमें दो TextViews और दो संबंधित स्ट्रिंग संसाधन बनाने की आवश्यकता है:

स्ट्रिंग्स.xml फ़ाइल खोलें, और निम्न जोड़ें:

MotionSensors पिच सेंसर:% 1 $ .2f रोल सेंसर:% 1 $ .2f कोई मोशन सेंसर उपलब्ध नहीं है

अपने ऐप में रोटेशन वेक्टर सेंसर का उपयोग करना

हम अपने पिछले अनुप्रयोगों में से कुछ कोड का फिर से उपयोग कर रहे हैं, इसलिए उन क्षेत्रों पर ध्यान केंद्रित करें जहां रोटेशन वेक्टर सेंसर के साथ संचार करना, जो हमने पहले देखा था, उससे काफी भिन्न है।

1. TYPE_ROTATION_VECTOR का उपयोग करें

चूंकि हम रोटेशन वेक्टर सेंसर के साथ काम कर रहे हैं, हमें getDefaultSensor () विधि को कॉल करने की आवश्यकता है, और फिर इसे TYPE_ROTATION_VECTOR स्थिर पास करें:

positionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR);

2. सेंसर डेटा का अनुवाद करें

पिछले प्रकाश और निकटता सेंसर के विपरीत, गति सेंसर हर सेंसर के लिए सेंसर मूल्यों के बहुआयामी सरणियों को वापस करते हैं। ये मान मानक "X, Y, Z" समन्वय प्रणाली का उपयोग करके तैयार किए गए हैं, जो डिवाइस के सापेक्ष गणना की जाती है जब वह अपने डिफ़ॉल्ट, "प्राकृतिक" अभिविन्यास में आयोजित होता है।

एंड्रॉइड इन X, Y और Z को स्विच नहीं करता है, जो डिवाइस के वर्तमान अभिविन्यास से मेल खाने के लिए चारों ओर समन्वय करता है, इसलिए "X" अक्ष समान रहेगा चाहे डिवाइस पोर्ट्रेट या लैंडस्केप मोड में हो। रोटेशन वेक्टर सेंसर का उपयोग करते समय, आपको डिवाइस के वर्तमान रोटेशन से मिलान करने के लिए आने वाले डेटा को बदलने की आवश्यकता हो सकती है।

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

सबसे पहले, डिवाइस समन्वय प्रणाली एक मानक 3-अक्ष एक्स, वाई, जेड समन्वय प्रणाली है, जहां तीन अक्षों में से प्रत्येक पर प्रत्येक बिंदु को 3 डी वेक्टर द्वारा दर्शाया गया है। इसका मतलब है कि हमें 9 फ्लोट मानों की एक सरणी बनाने की आवश्यकता है:

फ्लोट रोटेटमैट्रिक्स = नया फ्लोट;

फिर हम इस सरणी को getRotationMatrix () विधि से पास कर सकते हैं:

SensorManager.getRotationMatrixFromVector (रोटेटमैट्रिक्स, वैक्टर); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z;

अगला चरण, सेंसर के डेटा को हटाने के लिए SensorManager.remapCoordinateSystem () विधि का उपयोग कर रहा है, जो डिवाइस के वर्तमान अभिविन्यास पर आधारित है।

SensorManager.remapCoordinateSystem () विधि निम्नलिखित तर्क लेती है:

  • मूल रोटेशन मैट्रिक्स।
  • जिन कुल्हाड़ियों का आप रीमैप करना चाहते हैं।
  • वह सरणी जिसे आप इस नए डेटा से जोड़ रहे हैं।

यहां मेरे ऐप में उपयोग किया जा रहा कोड होगा:

फ़्लोट एडजस्टमेंटमोट्रिक्स = नया फ्लोट; SensorManager.remapCoordinateSystem (रोटेशनमैटिक्स, worldAxisX, worldAxisZ, AdjustRotationMatrix);

अंत में, हम SensorManager.getOrientation को कॉल करेंगे और इसे समायोजित करने के लिए कहेंगे।

SensorManager.getOrientation (AdjustRotationMatrix, ओरिएंटेशन);

3. प्लेसहोल्डर स्ट्रिंग्स को अपडेट करें

चूंकि हमारे पास डेटा (पिच और रोल) के दो सेट हैं, हमें दो अलग-अलग प्लेसहोल्डर स्ट्रिंग्स को पुनः प्राप्त करने की आवश्यकता है, उन्हें सही मानों के साथ पॉप्युलेट करें, और फिर संबंधित TextView को अपडेट करें:

पिचटेक्स्ट व्यू.सेटटेक्स्ट (getResources ()। getString (R.string.pitch_sensor, पिच)); rollTextView.setText (getResources ()। getString (R.string.roll_sensor, roll));

एकाधिक सेंसर डेटा प्रदर्शित करना: पूर्ण कोड

उपरोक्त चरणों को करने के बाद, आपकी मुख्यता कुछ इस तरह दिखनी चाहिए:

आयात android.app.Activity; आयात android.os.Bundle; आयात android.hardware.Sensor; आयात android.hardware.SensorEvent; आयात android.hardware.SensorEventListener; आयात android.hardware.SensorManager; आयात android.widget.TextView; सार्वजनिक वर्ग MainActivity गतिविधि का विस्तार करता है SensorEventListener {निजी SensorManager motionSensorManager; निजी सेंसर मोशन सेंसर; निजी टेक्स्ट व्यू पिच टेक्स्ट व्यू; निजी टेक्स्ट व्यू रोलटेक्स्ट व्यू; निजी स्थिर अंतिम int SENSOR_DELAY = 500 * 1000; निजी स्थिर अंतिम इंट FROM_RADS_TO_DEGS = -57; @Override संरक्षित शून्य onCreate (बंडल सहेजी गई InstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); पिचटेक्स्ट व्यू = (टेक्स्ट व्यू) findViewById (R.id.pitchTextView); rollTextView = (TextView) findViewById (R.id.rollTextView); try {motionSensorManager = (SensorManager) getSystemService (Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR); motionSensorManager.registerListener (यह, गति सेंसर, SENSOR_DELAY); } पकड़ (अपवाद ई) {पिचTViewView.setText (R.string.no_sensor); rollTextView.setText (R.string.no_sensor); }} @Override public void onAccuracyChanged (सेंसर सेंसर, इंट सटीकता) {// To // // @Override public void onSensorChanged (SensorEvent event) {if (Event .sensor == motionSensor) {update (event.values); }} निजी शून्य अद्यतन (फ्लोट वैक्टर) {// रोटेशन मैट्रिक्स की गणना करें। फ्लोट रोटेशनमैट्रिक्स = नया फ्लोट; SensorManager.getRotationMatrixFromVector (रोटेटमैट्रिक्स, वैक्टर); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z; // गतिविधि के वर्तमान अभिविन्यास के आधार पर मैट्रिक्स को रिमैप करें। फ्लोट एडजस्टेबलरोमेशनमैट्रिक्स = नया फ्लोट; SensorManager.remapCoordinateSystem (रोटेशनमैटिक्स, worldAxisX, worldAxisZ, AdjustRotationMatrix); // डिवाइस ओरिएंटेशन की गणना करें। फ्लोट ओरिएंटेशन = नया फ्लोट; // getOrientation () विधि // SensorManager.getOrientation (समायोजितप्रोटेशनमैट्रिक्स, अभिविन्यास) के लिए फ्लोट मानों के सरणी की आपूर्ति करें; फ्लोट पिच = ओरिएंटेशन * FROM_RADS_TO_DEGS; फ्लोट रोल = ओरिएंटेशन * FROM_RADS_TO_DEGS; // पिच और रोल वैल्यू के साथ टेक्स्टव्यू को अपडेट करें // पिचटेक्स व्यू.सेटटेक्स्ट (getResources ()। getString (R.string.pitch_sensor, पिच)); rollTextView.setText (getResources ()। getString (R.string.roll_sensor, roll)); }}

आप पूरा प्रोजेक्ट GitHub से डाउनलोड कर सकते हैं।

हमारे अंतिम एंड्रॉइड सेंसर एप्लिकेशन का परीक्षण

भौतिक एंड्रॉइड स्मार्टफोन या टैबलेट पर इस रोटेशन वेक्टर एंड्रॉइड सेंसर ऐप का परीक्षण करने के लिए:

  • अपने डिवाइस पर एप्लिकेशन इंस्टॉल करें।
  • अपने स्मार्टफोन या टैबलेट को समतल सतह पर रखें। ध्यान दें कि गति संवेदक अत्यंत संवेदनशील होते हैं, इसलिए पिच और रोल मूल्यों में उतार-चढ़ाव की रिपोर्ट करने के लिए यह प्रतीत होता है कि गतिहीन डिवाइस के लिए असामान्य नहीं है।
  • पिच का परीक्षण करने के लिए, अपने डिवाइस के निचले हिस्से को उठाएं ताकि वह आपसे दूर हो जाए। पिच का मूल्य नाटकीय रूप से बदलना चाहिए।
  • रोल का परीक्षण करने के लिए, अपने डिवाइस के बाएँ हाथ को ऊपर उठाने का प्रयास करें, इसलिए यह बाईं ओर झुका हुआ है - इस रोल वैल्यू पर नज़र रखें!

यदि आप किसी एमुलेटर पर अपनी परियोजना का परीक्षण कर रहे हैं:

  • अपने AVD पर एप्लिकेशन इंस्टॉल करें।
  • "अधिक" का चयन करें, जो "विस्तारित नियंत्रण" विंडो लॉन्च करता है।
  • बाएं हाथ के मेनू में, "वर्चुअल सेंसर" चुनें।
  • सुनिश्चित करें कि "एक्सेलेरोमीटर" टैब चुना गया है। इस टैब में नियंत्रण होते हैं जो डिवाइस की स्थिति और अभिविन्यास में बदलावों का अनुकरण कर सकते हैं।
  • विभिन्न स्लाइडर्स (रोटेट: जेड-रोट, एक्स-रोट, वाई-रोट; और मूव: एक्स, वाई, और जेड) और विभिन्न "डिवाइस रोटेशन" बटन के साथ प्रयोग करने का प्रयास करें, यह देखने के लिए कि वे आपके एप्लिकेशन के "रोल सेंसर" को कैसे प्रभावित करते हैं। "और" पिच सेंसर "मूल्यों।

समेट रहा हु

इस लेख में, हमने देखा कि एंड्रॉइड सेंसर की तीन मुख्य श्रेणियों: पर्यावरण, स्थिति और गति, और वास्तविक समय में इस डेटा की निगरानी कैसे की जाए।

क्या आपने कोई एंड्रॉइड ऐप देखा है जो दिलचस्प या अनूठे तरीकों से सेंसर का उपयोग करते हैं? नीचे टिप्पणी करके हमें बताएं!

यदि आप एक अति पतली मामले की तलाश में हैं तो नोट 8 एमएनएमएल स्लिम केस से आगे नहीं देखें। यह मामला सिर्फ 0.35 मिमी पतला है, हां यह टाइपो नहीं है, यह पतली है। वे दावा करते हैं कि दुनिया का सबसे पतला मामल...

FYY वॉलेट का मामला असली लेदर के साथ बनाया गया है और यह काफी प्रभावित करता है। सामने के फ्लैप को एक चुंबकीय अकवार के साथ रखा जाता है और इसे मोड़कर किकस्टैंड के रूप में भी इस्तेमाल किया जा सकता है। क्रे...

दिलचस्प प्रकाशन