1

是否可以在一项活动中读取 GPS 数据和加速度计数据?我想读取数据并放入文本视图。我已经读取了加速度计数据,但是当我在 Activity 中添加此代码时应用程序崩溃

public class MainActivity extends Activity implements SensorEventListener {
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    valuesInitialization();
    sensorsInitialization();

}

private void valuesInitialization()
{
    Config.mContext = this;
    mInitialized = false;
    mLastAccelerometer[0] = INITVALUE;
    mLastAccelerometer[1] = INITVALUE;
    mLastAccelerometer[2] = INITVALUE;
    mLastGyroscope[0] = INITVALUE;
    mLastGyroscope[1] = INITVALUE;
    mLastGyroscope[2] = INITVALUE;
    mLastOrientation[0] = INITVALUE;
    mLastOrientation[1] = INITVALUE;
    mLastOrientation[2] = INITVALUE;
}

private void sensorsInitialization() 
{
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
    mGyroscope = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
    mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

    mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
}

private void registListener() 
{
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(this, mOrientation, SensorManager.SENSOR_DELAY_NORMAL);
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
}

protected void onResume() 
{
    super.onResume();
    registListener();
}

protected void onPause() 
{
    super.onPause();
    mSensorManager.unregisterListener(this);
    }
}

有没有办法解决这个问题?提前致谢

错误日志:在此处输入图像描述 在此处输入图像描述

4

3 回答 3

2

您是否在 Manifest.xml 中添加了 GPS 权限?

于 2013-09-24T12:17:31.190 回答
2

你必须在你的类中实现一个位置监听器,如下所示

public class LocationListener implements android.location.LocationListener {
    final String LOG_LABEL = "Location Listener>>";

    @Override
    public void onLocationChanged(Location location) {
        Log.d(util.TAG,LOG_LABEL+ "Location Changed");
        if (location != null)
        {
            double longitude = location.getLongitude();
            Log.d(util.TAG,LOG_LABEL+ "Longitude:" + longitude);
            Toast.makeText(getApplicationContext(),"Long::"+longitude,Toast.LENGTH_SHORT).show();
            double latitude = location.getLatitude();
            Toast.makeText(getApplicationContext(),"Lat::"+latitude,Toast.LENGTH_SHORT).show();
            Log.d(util.TAG,LOG_LABEL+ "Latitude:" + latitude);

            cleanUp();

        }
    }

并且还定义了一个位置监听器,如下所示

private android.location.LocationListener locListener;

然后为了让听众开始,做

this.locListener = new LocationListener();

一旦你得到了 long/lat 值,不要忘记清理,如下所示

cleanUp()
{
     // This needs to be done to stop getting the location data and save the
    // battery power.
    if (null != this.locListener && null != locationManager)
    {
        locationManager.removeUpdates(this.locListener);
        this.locListener = null;
    }
}
于 2013-09-24T12:28:21.980 回答
1

registListener(拼写错误):

private void registListener() 
{
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(this, mOrientation, SensorManager.SENSOR_DELAY_NORMAL);
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
}

发生错误是因为 mLocationListener 为空。

您应该LocationListener在自己的 Activity 中实现,并作为侦听器mLocationManager.requestLocationUpdates传入。this

编辑:如果您实现LocationListener位于android.location,您将覆盖这些方法:

public void onLocationChanged (Location location);
public void onProviderEnabled (String provider);
public void onProviderDisabled (String provider);
public void onStatusChanged (String provider, int status, Bundle extras)

onLocationChanged当用户移动的距离等于或大于 的第三个参数中指定的距离mLocationManager.requestLocationUpdates,并且经过的时间超过第二个参数中指定的时间(以毫秒为单位)时调用。location您可以随心所欲地使用该对象。

onProviderEnabled当启用提供 GPS 位置的提供商之一时调用。您可以检索提供者的类型(可能是LocationManager.GPS_PROVIDERGPS、LocationManager.NETWORK_PROVIDERWi-Fi 或蜂窝位置)。

onProviderDisabled类似于onProviderEnabled但它在提供程序被禁用时被调用。

最后,包括所有方法在内的所有方法onStatusChanged都记录在此处

Location类在 packageandroid.location中,它以高度、方位、速度、时间、附加值、纬度、经度、位置提供者和准确性提供当前用户位置。

于 2013-09-24T12:19:37.453 回答