privatelateinitvarsensorManager:SensorManagersensorManager=getSystemService(Context.SENSOR_SERVICE)asSensorManagerif(sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)!=null){// Success! There's a magnetometer.}else{// Failure! No magnetometer.
privateSensorManagersensorManager;sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);if(sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)!=null){// Success! There's a magnetometer.}else{// Failure! No magnetometer.
如果您希望针对不同制造商的传感器或传感器的不同版本优化您的应用,有两种公共方法特别有用。例如,如果您的应用需要监控倾斜和摇晃等用户手势,您可以为具有特定供应商的重力传感器的新设备创建一组数据过滤规则和优化,并为没有重力传感器且只有加速度计的设备创建另一组数据过滤规则和优化。以下代码示例展示了如何使用 getVendor() 和 getVersion() 方法来执行此操作。在本例中,我们要查找一个将 Google LLC 列为供应商、版本号为 3 的重力传感器。如果设备上没有该传感器,我们会尝试使用加速度计。
Kotlin
privatelateinitvarsensorManager:SensorManagerprivatevarmSensor:Sensor? =nullsensorManager=getSystemService(Context.SENSOR_SERVICE)asSensorManagerif(sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)!=null){valgravSensors:List<Sensor>=sensorManager.getSensorList(Sensor.TYPE_GRAVITY)// Use the version 3 gravity sensor.mSensor=gravSensors.firstOrNull{it.vendor.contains("Google LLC") && it.version==3}if(mSensor==null){// Use the accelerometer.mSensor=if(sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)!=null){sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)}else{// Sorry, there are no accelerometers on your device.// You can't play this game.
privateSensorManagersensorManager;privateSensormSensor;sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);mSensor=null;if(sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)!=null){List<Sensor>gravSensors=sensorManager.getSensorList(Sensor.TYPE_GRAVITY);for(inti=0;i<gravSensors.size();i++){if((gravSensors.get(i).getVendor().contains("Google LLC"))
&&
(gravSensors.get(i).getVersion()==3)){// Use the version 3 gravity sensor.mSensor=gravSensors.get(i);if(mSensor==null){// Use the accelerometer.if(sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)!=null){mSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);}else{// Sorry, there are no accelerometers on your device.// You can't play this game.
classSensorActivity:Activity(),SensorEventListener{privatelateinitvarsensorManager:SensorManagerprivatevarmLight:Sensor? =nullpublicoverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.main)sensorManager=getSystemService(Context.SENSOR_SERVICE)asSensorManagermLight=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)overridefunonAccuracyChanged(sensor:Sensor,accuracy:Int){// Do something here if sensor accuracy changes.overridefunonSensorChanged(event:SensorEvent){// The light sensor returns a single value.// Many sensors return 3 values, one for each axis.vallux=event.values[0]// Do something with this sensor value.overridefunonResume(){super.onResume()mLight?.also{light->
sensorManager.registerListener(this,light,SensorManager.SENSOR_DELAY_NORMAL)overridefunonPause(){super.onPause()sensorManager.unregisterListener(this)
publicclassSensorActivityextendsActivityimplementsSensorEventListener{privateSensorManagersensorManager;privateSensormLight;@OverridepublicfinalvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);mLight=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);@OverridepublicfinalvoidonAccuracyChanged(Sensorsensor,intaccuracy){// Do something here if sensor accuracy changes.@OverridepublicfinalvoidonSensorChanged(SensorEventevent){// The light sensor returns a single value.// Many sensors return 3 values, one for each axis.floatlux=event.values[0];// Do something with this sensor value.@OverrideprotectedvoidonResume(){super.onResume();sensorManager.registerListener(this,mLight,SensorManager.SENSOR_DELAY_NORMAL);@OverrideprotectedvoidonPause(){super.onPause();sensorManager.unregisterListener(this);
privatelateinitvarsensorManager:SensorManagersensorManager=getSystemService(Context.SENSOR_SERVICE)asSensorManagerif(sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE)!=null){// Success! There's a pressure sensor.}else{// Failure! No pressure sensor.
privateSensorManagersensorManager;sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);if(sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE)!=null){// Success! There's a pressure sensor.}else{// Failure! No pressure sensor.
使用 Google Play 过滤器定位特定的传感器配置
如果您要在 Google Play 上发布应用,您可以在清单文件中使用 <uses-feature>
元素,以对不具备适合您应用的传感器配置的设备屏蔽您的应用。<uses-feature> 元素有几个硬件描述符,可让您根据是否存在特定传感器来过滤应用。您可以列出的传感器包括:加速度计、气压计、罗盘(地磁场)、陀螺仪、光传感器和距离传感器。以下清单示例条目会对没有加速度计的设备屏蔽应用: