java - 在 Android Studio 中同时使用加速度计和 GPS 的问题

标签 java android gps

我对 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/

相关文章:

java - 从文本文件读取数据并用数组构建表

java - 使用 JAXB 2.x 基于 XSD 在运行时解析 XML

android - 尝试使用 Retrofit 在没有正文的情况下进行 POST,但因 GSON 解析异常而失败

android - 为什么 Toolbar 取代了 ActionBar?

ruby - 如何使用 ruby​​ 读取恒定的 NMEA http 数据流

java - 如何返回卡在 for 循环中的 int 值

Android TextView 问题

Android - 可靠地获取当前位置

android - 位置经理内部服务

java - 需要了解一些 `ant fat/shaded` jar概念