我对 android studio 编程还很陌生,我已经尝试解决这个问题有一段时间了,但我不确定问题是什么。我尝试同时使用加速度计和 GPS 的组合来获取更准确的设备加速度和速度数字,但是当我尝试启动加速度计时,它会抛出此异常:
java.lang.RuntimeException: Unable to start activity ComponentInfo
原因:java.lang.IllegalStateException:系统服务在 onCreate() 之前对 Activity 不可用
这是主要 Activity :
package com.example.accelerometergps;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity implements LocationListener {
private Accelerometer a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LocationManager l = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
l.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
this.onLocationChanged(null);
a = new Accelerometer();
//It works fine if I remove the following line
a.registerListener();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onLocationChanged(Location location) {
TextView tv = (TextView) findViewById(R.id.textView);
if (location == null) {
tv.setText("no GPS");
} else {
double temp = location.getSpeed();
double speed = 2.23694 * temp;
// tv.setText(String.valueOf(speed));
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
这是加速度计类:
package com.example.accelerometergps;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
public class Accelerometer extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mAccelerometer;
double[] accelerationList = new double[5];
double averageAcceleration;
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void registerListener() {
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
public void unregisterListener() {
mSensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
double temp = sumAcceleration(x, y, z);
addToList(temp);
averageAcceleration = accelerationListAverage();
}
public double sumAcceleration(float i, float j, float k) {
float temp = i * i + j * j + k * k;
double linearAcceleration = Math.sqrt(temp) - 9.8;
return linearAcceleration;
}
public double accelerationListAverage() {
double sum = 0;
for (int i = 0; i < 5; i++) {
sum += accelerationList[i];
}
return (sum / 5);
}
public void addToList(double a) {
double b = accelerationList[0];
double c = accelerationList[1];
double d = accelerationList[2];
double e = accelerationList[3];
accelerationList[0] = a;
accelerationList[1] = b;
accelerationList[2] = c;
accelerationList[3] = d;
accelerationList[4] = e;
}
public double getAcceleration() {
return averageAcceleration;
}
}
任何帮助或建议将不胜感激,提前谢谢您。
最佳答案
您永远不应该直接创建 Activity 。您的 MainActivity 持有一个加速度计,其类型为 Activity。那是错误的。您需要重新构建事物,使加速度计不再是一项 Activity 。它应该在 Context 中传递,以从当前 Activity 中获取所需的任何内容。
关于java - 在 Android Studio 中同时使用加速度计和 GPS 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29723100/