Android位置未从自定义类返回位置

时间:2013-08-05 00:35:17

标签: java android geolocation gps locationmanager

我有自己的位置课程。我有一个赔率结果,当我使用我的班级搜索GPS位置时,我得到0,0回。

然而,如果我在位置管理器中搜索GPS的getLastKnown函数,我会得到强制值:

    public Location getGPSloc(Context c){
    isGPSavailable(c);
    if(gps_enabled)
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListenerGps);
    timerGPS  = new Timer();
    timerGPS.schedule(new GetLastLocationGPS(), 45000);
    return gpsLoc;  
}

这是我从函数外部调用的类,我在调用中使用this.getApplicationContext()。这是GetLastLocationGPS():

    class GetLastLocationGPS extends TimerTask {
    @Override
    public void run() {
         lm.removeUpdates(locationListenerGps);
         if(gps_enabled){
             gpsLoc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);}
         else{
             gpsLoc = null;
         }

    }
}

以下是听众:

    LocationListener locationListenerGps = new LocationListener() {
    @Override
    public void onLocationChanged(Location location) {
        timerGPS.cancel();
        gpsLoc = location; 
        lm.removeUpdates(this);
    }
    @Override
    public void onProviderDisabled(String provider) {}
    @Override
    public void onProviderEnabled(String provider) {}
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}
};

当我调用MyLocationInstance.getGPSloc(this.getApplicationContext())时,返回值始终为0,0。我发送到模拟器的强制值为83 43,如果我在LocationManagerInstance.getLastKnownLocation(LM)中显示。全球定位系统);

我不知道为什么这个方法不会获取该位置。

是否因为理论上定时器在呼叫发生时仍在运行?这是我能想出答案的唯一方法。还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定你的问题是什么,但这是我的代码,它处于负载状态并且功能齐全。

由于此类从Fragment扩展,因此它可以充当片段的父级。 有一个听众,你的班级可以在每个间隔后获得新的位置。

public class LocationFinderFragment extends Fragment implements
        GooglePlayServicesClient.ConnectionCallbacks,
        GooglePlayServicesClient.OnConnectionFailedListener {

    public interface OnNewLocationFoundListener {
        public void OnNewLocationFound(Location location);
    }

    private static final String TAG = "LocationFinderFragment";
    private static final long DEFAULT_UPDATE_LOCATION_INTERVAL = 30 * 1000; // update every 30 seconds
    private static final long DEFAULT_TERMINATE_SAT_FINDING = 1 * 60 * 60 * 1000; // for 1 hour

    private OnNewLocationFoundListener listener;  // Listener of fragments
    private OnNewLocationFoundListener listener2; // Listener of MainFragmentHolder
    private Context context;
    private LocationClient mLocationClient;
    private static double lat = 0;
    private static double lng = 0;
    private static long lastTime = 0;

    private LocationListener mLocationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            if(location == null)
                return;

            if(lat == location.getLatitude()  &&  lng == location.getLongitude()) {
                Log.e(TAG, "location not changed.");
                return;
            }

            lat = location.getLatitude();
            lng = location.getLongitude();
            Log.i(TAG, "Location changed to (" + lat + ", " + lng + ")");

            // Ask fragment to get new data and update screen
            listener.OnNewLocationFound(location);

            // Display toast notification every minute (instead of every 30 seconds)
            DateTime time = new DateTime();
            long currentTime = time.getMillis();
            if(currentTime > lastTime + 1 * 60 * 1000) {
                listener2.OnNewLocationFound(location);
                lastTime = currentTime;
            }
        }
    };

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        try {
            listener2 = (OnNewLocationFoundListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnNewLocationFoundListener interface.");
        }

        Log.i(TAG, "Fragment attached to activity.");
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Getting context
        context = getActivity().getApplicationContext();

        // Get location manager
        mLocationClient = new LocationClient(context, this, this);
    }

    @Override
    public void onResume() {
        super.onResume();

        // Get location
        if(mLocationClient != null)
            mLocationClient.connect();
    }

    @Override
    public void onPause() {
        super.onPause();

        // remove listener in order to save resource
        if(mLocationClient != null)
            mLocationClient.disconnect();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // remove listener in order to save resource
        if(mLocationClient != null)
            mLocationClient.disconnect();
    }

    @Override
    public void onConnected(Bundle bundle) {
        Log.i(TAG, "Location Connected.");
        // Get last known location
        Location lastLocation = mLocationClient.getLastLocation();
        mLocationListener.onLocationChanged(lastLocation);

        if(!SpGodMode.isLocationModeEnabled(context)) {
            // Create location request
            LocationRequest locationRequest = LocationRequest.create()
                    .setInterval(DEFAULT_UPDATE_LOCATION_INTERVAL)
                    .setExpirationDuration(DEFAULT_TERMINATE_SAT_FINDING)
                    .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
            mLocationClient.requestLocationUpdates(locationRequest, mLocationListener);
        } else {
            String strLoc = SpGodMode.getLocation(context);
            if(strLoc != null) {
                String lat = strLoc.substring(0, strLoc.indexOf(","));
                String lng = strLoc.substring(strLoc.indexOf(",") + 1);
                Location location = new Location("");
                try {
                    location.setLatitude(Double.parseDouble(lat));
                    location.setLongitude(Double.parseDouble(lng));
                    mLocationListener.onLocationChanged(location);
                } catch (NumberFormatException e) {
                    Log.e(TAG, "Wrong lat/lng for parsing as Double.");
                    Toast.makeText(context, "Wrong lat/lng", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

    @Override
    public void onDisconnected() {
        Log.i(TAG, "Location Disconnected.");
        if(mLocationClient != null  &&  mLocationClient.isConnected())
            mLocationClient.removeLocationUpdates(mLocationListener);
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.e(TAG, "Connection failed listener.");
    }

    public void setLocationListener(OnNewLocationFoundListener listener) {
        this.listener = listener;
    }

    public void disconnectLocation() {
        mLocationClient.disconnect();
    }
}