Android传感器无法在服务中运行

编程入门 行业动态 更新时间:2024-10-13 08:21:57
本文介绍了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="schemas.android/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传感器无法在服务中运行

本文发布于:2023-11-24 02:32:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1623645.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:传感器   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!