الحصول على بيانات من أجهزة استشعار Android بدون مستمعين
-
04-10-2019 - |
سؤال
لدي الرمز التالي:
public class readSensorsData extends Activity implements SensorListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
}
@Override
public void onSensorChanged(int sensor, float[] values) {
synchronized (this) {
if (sensor == SensorManager.SENSOR_ORIENTATION) {
//get orientation
}
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
//get acceleration
}
}
if (sensor == SensorManager.SENSOR_MAGNETIC_FIELD) {
//get magnetic fiels
}
Bundle bundle = new Bundle(); //results from activity
bundle.putFloatArray("acceleration", array);
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
finish();
}
public void onAccuracyChanged(int sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
sm.registerListener(this,
SensorManager.SENSOR_ORIENTATION |
SensorManager.SENSOR_ACCELEROMETER |
SensorManager.SENSOR_MAGNETIC_FIELD,
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onStop() {
sm.unregisterListener(this);
super.onStop();
}
}
الكود يعمل ولكن هنا يذهب مشكلتي: عندما أسميها من النشاط الرئيسي بهذه الطريقة:
Intent i = new Intent(this, readSensorsData.class);
startActivityForResult(i, 1); //1 is for sensors
for(int j=0;j<10;j++)
{
//do sth else here!!!!
try {
Thread.sleep(1000);
} catch (InterruptedException e) {e.printStackTrace();}
//here code for showing result from sensor activity
}
ثم أستطيع أن أرى 10 مرات نتيجة "القيام بـ STH آخر !!!" وعندما تنتهي الحلقة ، يمكنني أن أرى ثم ناتجة عن النشاط. لذلك ينتظر نشاط المستشعر لسبب ما ، وبعد ذلك عندما لا يكون النشاط الرئيسي لا يفعله ، تقوم المستشعرات بعملها.
بالطبع لقد قمت بتنفيذ جيد: onActivityResult (int requestcode ، int resultcode ، نية النية)
أريد قراءة بيانات Sensord مباشرة ، وليس استخدام المستمعين ، هل هذا ممكن؟
المحلول
أولاً، أبداً مكالمة Thread.sleep()
في موضوع التطبيق الرئيسي.
ثانيا، startActivityForResult()
غير متزامن. لن يبدأ النشاط الآخر متى startActivityForResult()
عائدات.
ثالثًا ، أحداث المستشعر غير متزامنة.
لذلك ينتظر نشاط المستشعر لسبب ما
لا يمكن أن تبدأ حتى تخرج من موضوع التطبيق الرئيسي ، الذي يتم ربطه من قبل الخاص بك Thread.sleep()
المكالمات.
ثم عندما لا يفعل النشاط الرئيسي شيئًا ، فإن المستشعرات تقوم بعملهم.
على وجه التحديد.
أريد قراءة بيانات Sensord مباشرة ، وليس استخدام المستمعين ، هل هذا ممكن؟
لا. فقط استخدم المستمعين بشكل صحيح. فيما يلي ثلاثة مشاريع عينة إظهار استخدام مستمعي المستشعر.