您好,登錄后才能下訂單哦!
識別傳感器及其功能
The Android sensor framework provides several methods that make it easy for you to determine at runtime which sensors are on a device. The API also provides methods that let you determine the capabilities of each sensor, such as its maximum range, its resolution, and its power requirements.
To identify the sensors that are on a device you first need to get a reference to the sensor
service. To do this, you create an instance of the SensorManager
class by
calling the getSystemService()
method and passing
in the SENSOR_SERVICE
argument. For example:
識別設(shè)備上的傳感器你首先需要得到 sensor service 的一個引用。為了得到這個引用,你調(diào)用getSystemService()方法并傳遞SENSOR_SERVICE
參數(shù)來獲得 SensorManager 類的實例。
private SensorManager mSensorManager; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Next, you can get a listing of every sensor on a device by calling the getSensorList()
method and using the TYPE_ALL
constant. For example:
然后你可以用 getSensorList() 列舉設(shè)備上所有傳感器。
List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
If you want to list all of the sensors of a given type, you could use another constant instead of TYPE_ALL
such as TYPE_GYROSCOPE
,TYPE_LINEAR_ACCELERATION
, orTYPE_GRAVITY
.
也可傳遞其他參數(shù)類列列舉特定類型的所有傳感器。
You can also determine whether a specific type of sensor exists on a device by using the getDefaultSensor()
method and passing in the type
constant for a specific sensor. If a device has more than one sensor of a given type, one of the
sensors must be designated as the default sensor. If a default sensor does not exist for a given
type of sensor, the method call returns null, which means the device does not have that type of
sensor. For example, the following code checks whether there's a magnetometer on a device:
你也可以用getDefaultSensor(),傳遞特定傳感器的類型常量來確定某種傳感器是否在設(shè)備上。如果這種傳感器不止一個,一定指定其中一個為默認(rèn)的傳感器。如果某個特定類型的默認(rèn)傳感器不存在,這個方法返回null,表示設(shè)備上不存在這種傳感器。例如以下的代碼檢測設(shè)備上是否有磁力計。
private SensorManager mSensorManager; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){ // Success! There's a magnetometer. } else { // Failure! No magnetometer. }
Note: Android does not require device manufacturers to build any particular types of sensors into their Android-powered devices, so devices can have a wide range of sensor configurations.
Android 不強求制造商在他們的Android設(shè)備上搭載某些傳感器,所以設(shè)備上的傳感器類別并不固定。
In addition to listing the sensors that are on a device, you can use the public methods of the Sensor
class to determine the capabilities and attributes of individual
sensors. This is useful if you want your application to behave differently based on which sensors or
sensor capabilities are available on a device. For example, you can use the getResolution()
and getMaximumRange()
methods to obtain a sensor's resolution and maximum range of measurement. You can also use the getPower()
method to obtain a sensor's power equirements.
你不僅可以列舉設(shè)備上的所有傳感器,還可以用Sensor 類的公共方法確定傳感器的功能和屬性。如果你的應(yīng)用根據(jù)某個傳感器或者某些傳感器功能而有不同行為,這會非常有用。例如,用 getResolution() 和 getMaximumRange() 方法獲得一個探測器的分辨率和測量的最大范圍。你也可以用getPower()方法獲得傳感器的電力需求。
Two of the public methods are particularly useful if you want to optimize your application for
different manufacturer's sensors or different versions of a sensor. For example, if your application
needs to monitor user gestures such as tilt and shake, you could create one set of data filtering
rules and optimizations for newer devices that have a specific vendor's gravity sensor, and another
set of data filtering rules and optimizations for devices that do not have a gravity sensor and have
only an accelerometer. The following code sample shows you how you can use the getVendor()
and getVersion()
methods to do
this. In this sample, we're looking for a gravity sensor that lists Google Inc. as the vendor and
has a version number of 3. If that particular sensor is not present on the device, we try to use the
accelerometer.
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){ List<Sensor> gravSensors = mSensorManager.getSensorList(Sensor.TYPE_GRAVITY); for(int i=0; i<gravSensors.size(); i++) { if ((gravSensors.get(i).getVendor().contains("Google Inc.")) && (gravSensors.get(i).getVersion() == 3)){ // Use the version 3 gravity sensor. mSensor = gravSensors.get(i); } } } else{ // Use the accelerometer. if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){ mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } else{ // Sorry, there are no accelerometers on your device. // You can't play this game. } }
Another useful method is the getMinDelay()
method,
which returns the minimum time interval (in microseconds) a sensor can use to sense data. Any sensor
that returns a non-zero value for the getMinDelay()
method is a streaming
sensor. Streaming sensors sense data at regular intervals and were introduced in Android 2.3 (API
Level 9). If a sensor returns zero when you call the getMinDelay()
method, it means the
sensor is not a streaming sensor because it reports data only when there is a change in the
parameters it is sensing.
The getMinDelay()
method is useful because it lets
you determine the maximum rate
at which a sensor can acquire data. If certain features in your application require high data
acquisition rates or a streaming sensor, you can use this method to determine whether a sensor
meets those requirements and then enable or disable the relevant features in your application
accordingly.
Caution: A sensor's maximum data acquisition rate is not necessarily the rate at which the sensor framework delivers sensor data to your application. The sensor framework reports data through sensor events, and several factors influence the rate at which your application receives sensor events. For more information, see Monitoring Sensor Events.
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。