【问题标题】:Android GPS not working for meAndroid GPS 不适合我
【发布时间】:2015-04-21 21:17:37
【问题描述】:

我的应用程序有两个需要 GPS 的活动,因此我尝试将其卸载到任何一个活动都可以使用的单独类。我在这里找到了一个看起来很简单的答案 Android - Best way to implement LocationListener across multiple activities 但是,当然,它对我不起作用。我想知道是否有人可以看到这个问题。我使用了几乎完全相同的代码,但我摆脱了 gps 设置对话框。

这是我的 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 对象的创建。侦听器中的其他方法均未执行。

【问题讨论】:

  • 您遇到的错误是什么?
  • 很抱歉。我编辑了帖子。基本上,侦听器中的任何内容似乎都没有执行。我根本没有收到任何这些日志条目。
  • 您是否拥有所需的权限,例如
  • 你能发布你的清单吗?
  • 抱歉,我现在无法发布清单,但我可以向您保证,我确实在清单中有。昨天我把我所有的工作 gps 代码从我的 startactivity 中移出,把它放在一个单独的类中。在我这样做之前它昨天工作,所以我知道这不是权限问题。我现在正在工作,这些是我复制的唯一文件,所以我无权访问清单,但如果您认为需要仔细检查,我可以在几个小时内发布。

标签: android gps


【解决方案1】:

GPS 类构造函数包含这一行:

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

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

你的界面看起来像这样:

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

}

因此,GPS 类获得了一个接口,您希望将其转换为一个 Activity 以从中获取系统服务。那是行不通的。

稍微改变你的 GPS 等级。例如:

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

在你的活动中调用它:

gps = new GPS(this, this);

【讨论】:

  • 看起来很有趣,您可能正在做一些事情。再过几个小时我将无法对其进行测试,但是当我测试它是否有效时,我会告诉你。
  • 是的,它确实有效,是的,我确实忘记了你!对不起:)
猜你喜欢
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2015-11-10
  • 2011-08-11
  • 2011-01-05
相关资源
最近更新 更多