Android的GPS不是为我工作 [英] Android GPS not working for me

查看:139
本文介绍了Android的GPS不是为我工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序有需要GPS两项活动,所以我试图将它卸载到一个单独的类,要么活动可以使用。我发现这里的答案看起来很容易的
<一href=\"http://stackoverflow.com/questions/5783611/android-best-way-to-implement-locationlistener-across-multiple-activities\">Android - 最佳的方式跨多个活动实施LocationListener的
但当然,这不是为我工作。我想知道如果任何人都可以看到这个问题。我用pretty正好差不多code,但我摆脱了GPS设置对话框。

My app has two activities that need GPS, so I tried to offload it to a separate class that either activity could use. I found an answer here that looked easy enough Android - Best way to implement LocationListener across multiple activities But of course, it's not working for me. I was wondering if anyone can see the issue. I used pretty much exactly the same code, but I got rid of the gps settings dialog.

下面是我的GPS类

package fieldlayout.skipmorrow.com.fieldlayout;

import android.app.Activity;
import android.content.Context;
import android.location.LocationManager;
import android.os.Bundle;

import android.location.LocationListener;

import android.location.Location;
import android.util.Log;


/**
 * Created by skip on 4/20/2015.
 */
public class GPS {
    private IGPSActivity main;

    // Helper for GPS-Position
    private LocationListener mlocListener;
    private LocationManager mlocManager;

    private boolean isRunning;

    public GPS(IGPSActivity main) {
        this.main = main;

        // GPS Position
        mlocManager = (LocationManager) ((Activity) this.main).getSystemService(Context.LOCATION_SERVICE);
        mlocListener = new MyLocationListener();
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
        // GPS Position END
        this.isRunning = true;
        Log.i("FieldLayout_GPS", "GPS Object created");
    }

    public void stopGPS() {
        if(isRunning) {
            mlocManager.removeUpdates(mlocListener);
            this.isRunning = false;
        }
        Log.i("FieldLayout_GPS", "stopGPS");
    }

    public void resumeGPS() {
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
        this.isRunning = true;
        Log.i("FieldLayout_GPS", "resumeGPS");
    }

    public boolean isRunning() {
        return this.isRunning;
    }

    public class MyLocationListener implements LocationListener {

        private final String TAG = MyLocationListener.class.getSimpleName();

        @Override
        public void onLocationChanged(Location loc) {
            GPS.this.main.locationChanged(loc.getLongitude(), loc.getLatitude());
            Log.i("FieldLayout_GPS", "onLocationChanged");
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.i("FieldLayout_GPS", "onStatusChanged");
        }

        @Override
        public void onProviderEnabled(String provider) {
            Log.i("FieldLayout_GPS", "onProviderEnabled");
        }

        @Override
        public void onProviderDisabled(String provider) {
            Log.i("FieldLayout_GPS", "onProviderDisabled");
        }
    }

}

接口文件

package fieldlayout.skipmorrow.com.fieldlayout;

/**
 * Created by skip on 4/20/2015.
 */
public interface IGPSActivity {
    public void locationChanged(double longitude, double latitude);
}

和我的执行从我的活动

package fieldlayout.skipmorrow.com.fieldlayout;

import android.content.Context;
import android.content.Intent;


public class StartActivity extends ActionBarActivity implements IGPSActivity{

    private Location currentLocation;
    private GPS gps;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        gps = new GPS(this);
    }

    @Override
    protected void onResume() {
        if (!gps.isRunning()) gps.resumeGPS();
        super.onResume();
    }

    @Override
    protected void onStop() {
        // Disconnecting the client invalidates it.
        Log.i("FieldLayout_StartAct", "onStop called. Disconnecting GPS client");
        gps.stopGPS();
        super.onStop();
    }

    @Override
    public void locationChanged(double longitude, double latitude) {
        Log.i("FieldLayout_StartAct", "locationChanged");
        currentLocation.setLatitude(latitude);
        currentLocation.setLongitude(longitude);
    }
}

我看到的唯一的日志是GPS对象的创建。在监听其他方法都没有被执行。

The only log I am seeing is the creation of the GPS object. None of the other methods in the listener are being executed.

推荐答案

GPS类的构造函数包含此行:

GPS class constructor contains this row:

 public GPS(IGPSActivity main) {
    this.main = main;

    // GPS Position
    mlocManager = (LocationManager) ((Activity) this.main).getSystemService(Context.LOCATION_SERVICE);
...
}

和你的界面看起来像这样:

And your interface looks like this:

public interface IGPSActivity {
    public void locationChanged(double longitude, double latitude);

}

因此​​,GPS类得到一个接口,你想将它转换成一个活动,以从中获得的系统服务。这是行不通的。

So, the GPS class get an interface, and you want to cast it into an Activity to get a system service from it. That is not going to work.

更改您的GPS类一点点。例如:

Change your GPS class a little bit. For example:

public GPS(IGPSActivity main, Activity activity){
    mlocManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
...
}

在您的活动调用此:

gps = new GPS(this, this);

这篇关于Android的GPS不是为我工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆