Android传感器无法在服务中运行 [英] Android sensors not working in a service

查看:138
本文介绍了Android传感器无法在服务中运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是android编程的新手,以下是我的用例:我有一个活动"MainActivity"和一个服务"MyService".我使用 startService 方法调用服务.在MyService.java中,我注册了2个不同的传感器(加速度计和灯光),并尝试获取传感器值.这似乎很基本,我通过以下方式编写代码:MainActivity.java

I'm pretty new to android programming and following is my use case : I have a single activity 'MainActivity' and a service 'MyService'. I call my service using startService method. In my MyService.java, I register for 2 different sensors (`accelerometer and light) and try to get sensor values. This seems pretty basic and I code it the following way : 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

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

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>

这似乎不起作用,因为未调用MyService.java文件中的 onSensorChanged 方法.我真的不能弄清楚我要去哪里错了.任何帮助表示赞赏.预先感谢.

This doesn't seem to work as the onSensorChanged method in MyService.java file doesn't get called. I can't really fathom where I'm going wrong. Any help is appreciated. Thanks in advance.

推荐答案

您需要注册一个监听器,以调用 onSensorChanged().您缺少这样的代码:

You need to register a listener for onSensorChanged() to be called. You are missing code like this:

sensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this, lSensor, SensorManager.SENSOR_DELAY_NORMAL);

这篇关于Android传感器无法在服务中运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆