私は Android を初めて使用するので、どこかで間違いを犯し、修正できないと思います。メイン アクティビティがあります。それをメイン メニューと呼びましょう。ここから、適切なボタンを押して必要なアクティビティを起動することで、他のアクティビティを開始します。問題は、起動されたアクティビティの 1 つで onSensorchanged() を使用することです。アプリケーションが初めて起動された場合、起動されたアクティビティの値は期待どおりに動作しますが、アクティビティを閉じて (つまり、メイン メニューに戻った場合)、再度アクティビティを起動すると、onSensorchanged() から読み取られた値が返されます。ジャンプします。正しい値が間違った値と組み合わされます。インテントを使用して 2 番目のアクティビティを起動しましたが、問題はこれにあると思います。
メインメニューコード:
public class MainMenuActivity extends Activity{
Button gps_btn,lineFollow_btn,man_control_btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_menu);
addListenerOnButton();
Debug.startMethodTracing("Navigation Trace");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_menu, menu);
return true;
}
@Override
protected void onPause()
{
super.onPause();
Debug.stopMethodTracing();
}
public void addListenerOnButton()
{
final Context context = this;
gps_btn = (Button) findViewById(R.id.GPS_btn);
gps_btn.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
Intent intent = new Intent(context, AutoControl.class);
startActivity(intent);
}
});
lineFollow_btn = (Button) findViewById(R.id.line_follower_btn);
lineFollow_btn.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
Intent intent2 = new Intent(context, CamDemoActivity.class);
startActivity(intent2);
}
});
man_control_btn = (Button) findViewById(R.id.man_ctrl_btn);
man_control_btn.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
Intent intent2 = new Intent(context, ManualAct_PLC.class);
startActivity(intent2);
}
});
}
OnSensorChanged のコード:
public void onSensorChanged(SensorEvent event)
{
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
gravity = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
geoMagnetic = event.values;
if (gravity != null && geoMagnetic != null)
{
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, gravity,geoMagnetic);
if (success)
{
/* Orientation has azimuth, pitch and roll */
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
float azimut = orientation[0];
updateSensorInfoView(azimut);
steerRobot(azimut);
System.out.println("Raw Sensor value:" + Double.toString(Math.toDegrees(azimut)));
System.out.println("Degree Sensor value:" + calculations.compassDegString(azimut));
}
}
}
ログに記録された値を表示すると、AutoControl アクティビティが再び起動されると、センサー データが予期しないものになります。
01-04 17:52:34.925: I/System.out(31387): Calculatebearing value:2.168326647225342
01-04 17:52:34.925: I/System.out(31387): Raw Sensor value:-116.11590698474976
01-04 17:52:34.925: I/System.out(31387): Degree Sensor value:244.0
01-04 17:52:34.955: I/System.out(31387): Calculatebearing value:173.96307878454928
01-04 17:52:34.955: I/System.out(31387): Raw Sensor value:72.0893408779263
01-04 17:52:34.955: I/System.out(31387): Degree Sensor value:72.0
01-04 17:52:35.065: I/System.out(31387): Calculatebearing value:108.5784565015826
01-04 17:52:35.065: I/System.out(31387): Raw Sensor value:137.473963160893
01-04 17:52:35.070: I/System.out(31387): Degree Sensor value:137.0
Notice the degree sensor value has jumped considerably in short time. I have an arrow that is drawn on the screen based on the calculated bearing angle, which jumps around like crazy once the activity is loaded the second time.
I am suspecting that a second instance is created of this activity, but used the android:launchMode="singleInstance" tag in the Manifest file to try and prevent this.
I have anyone else experienced such a problem? I dont seem to find similar problems on the net.