我是android编程的新手,以下是我的用例:我有一个活动“ MainActivity”和一个服务“ MyService”。我使用startService
方法调用服务。在MyService.java中,我注册了2个不同的传感器(加速度计和灯光),并尝试获取传感器值。这似乎很基本,我通过以下方式进行编码:MainActivity.java
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent i = new Intent(MainActivity.this, MyService.class);
startService(i);
}
MyService.java
public class MyService extends Service implements SensorEventListener{
public MyService() {
}
private SensorManager sensorManager; // this instance of SensorManager class will be used to get a reference to the sensor service.
private Sensor mSensor,lSensor; // this instance of Sensor class is used to get the sensor we want to use.
private float[] mGravity;
private float mAccel;
private float mAccelCurrent;
private float mAccelLast;
public void onAccuracyChanged(Sensor sensor,int accuracy){
}
// // if sensor value is changes, change the values in the respective textview.
public void onSensorChanged(SensorEvent event){
Log.d("sensorService", "onSensorChanged.");
Toast.makeText(MyService.this, "onSensorChanged", Toast.LENGTH_SHORT).show();
/* check sensor type */
if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
mGravity = event.values.clone();
// assign directions
float x=event.values[0];
float y=event.values[1];
float z=event.values[2];
float x1=event.values[0];
float y1=event.values[1];
float z1=event.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float)Math.sqrt(x*x + y*y + z*z); // we calculate the length of the event because these values are independent of the co-ordinate system.
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel*0.9f + delta;
if(mAccel > 3)
{
Toast.makeText(MyService.this, "Movement Detected.", Toast.LENGTH_SHORT).show();
}
}
else if(event.sensor.getType()==Sensor.TYPE_LIGHT)
{
float l = event.values[0];
}
/* unregister if we just want one result. */
// sensorManager.unregisterListener(this);
}
@Override
public void onCreate() {
super.onCreate(); // if you override onCreate(), make sure to call super().
// If a Context object is needed, call getApplicationContext() here.
Log.d("MyService", "onCreate");
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE); // get an instance of the SensorManager class, lets us access sensors.
mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // get Accelerometer sensor from the list of sensors.
lSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); // get light sensor from the list of sensors.
mAccel = 0.00f;
mAccelCurrent = SensorManager.GRAVITY_EARTH;
mAccelLast = SensorManager.GRAVITY_EARTH;
}
public int onStartCommand(Intent intent, int flags, int startId){
Log.d("MyService", "onStartCommand");
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE); // get an instance of the SensorManager class, lets us access sensors.
mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // get Accelerometer sensor from the list of sensors.
lSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); // get light sensor from the list of sensors.
mAccel = 0.00f;
mAccelCurrent = SensorManager.GRAVITY_EARTH;
mAccelLast = SensorManager.GRAVITY_EARTH;
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tyagi.smartalarm" >
<application
android:allowBackup="true"
android:icon="@drawable/web_hi_res_512"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".AlarmReceiver"
android:process=":remote" >
<!-- define android:process=":remote" so that the BroadcastReceiver will run in a separate process -->
<!-- so that it will continue to stay alive if the app has closed. -->
</receiver>
<service
android:name=".sensorService"
android:exported="false" />
<!-- exported determines whether or not the service can be executed by other applications. -->
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" >
</service>
</application>
</manifest>
由于onSensorChanged
未调用MyService.java文件中的方法,因此这似乎不起作用。我真的无法弄清楚哪里出了问题。任何帮助表示赞赏。提前致谢。
您需要注册一个监听器onSensorChanged()
才能被调用。您缺少这样的代码:
sensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this, lSensor, SensorManager.SENSOR_DELAY_NORMAL);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句