0

LocationClient を使用して Location を取得します。WiFi 接続では問題なく動作しますが、WiFi がないと同じ場所を繰り返します (モバイルデータ接続でも!)。LocationManager を使用しましたが、機能しませんでした。

Google マップが (モバイル データ接続で) 正常に動作するかどうか疑問に思っていますが、正しい場所を取得できません。

「LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY」または「LocationRequest.PRIORITY_HIGH_ACCURACY」を使用しても同じ結果になります。

ここに私のコードがあります:

public class LocationTracker implements
    GooglePlayServicesClient.ConnectionCallbacks,
    GooglePlayServicesClient.OnConnectionFailedListener {

LocationClient mLocationClient;
Location mCurrentLocation;
LocationRequest mLocationRequest;
LocationListener locationListener;
Handler handler = new Handler();

private static final int MILLISECONDS_PER_SECOND = 1000;
public static final int UPDATE_INTERVAL_IN_SECONDS = 5;
private static final long UPDATE_INTERVAL = MILLISECONDS_PER_SECOND
        * UPDATE_INTERVAL_IN_SECONDS;
private static final int FASTEST_INTERVAL_IN_SECONDS = 5;
private static final long FASTEST_INTERVAL = MILLISECONDS_PER_SECOND
        * FASTEST_INTERVAL_IN_SECONDS;

Context context;

public LocationTracker(Context context) {
    this.context = context;

}

public void getLocation() throws Exception {
    try {
        final int result = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(context);
        if (result != ConnectionResult.SUCCESS) {
            Toast.makeText(
                    context,
                    "Google Play service is not available (status="
                            + result + ")", Toast.LENGTH_LONG).show();

        }
    } catch (Exception e) {
        throw new Exception(e);
    }    

    mLocationClient = new LocationClient(context, this, this);
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL);

    mLocationClient.connect();

}

private final class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
    }
}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    Toast.makeText(context, "Connection Failed", Toast.LENGTH_LONG).show();

}

@Override
public void onConnected(Bundle connectionHint) {

    locationListener = new MyLocationListener();
    mLocationClient.requestLocationUpdates(mLocationRequest,
            locationListener);
    mCurrentLocation = mLocationClient.getLastLocation();

}

@Override
public void onDisconnected() {

}
4

2 に答える 2

0

コードでこの方法を試してください

if(isInternetEnabled==true)//check for internet connection here
{
 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,  
        locationListener);  
}
else
{
 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,  
        locationListener);  
}

というのGPS_PROVIDERは、位置情報の更新にすぐに反応しないことがよくあるからNETWORK_PROVIDERです。

Fused Location プロバイダーの例で解決する問題を試してみてください....

于 2014-07-26T08:42:37.943 に答える
0

私はそれを解決します。LocationClient.getLastLocation() は、最後にキャッシュされた場所を返します。LocationListener.onLocationChanged() で場所を確認する必要があり、場所が最後にキャッシュされた場所と等しくない場合は、それを使用できます。

コードは次のとおりです。

import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;

public class LocationTracker implements
    GooglePlayServicesClient.ConnectionCallbacks,
    GooglePlayServicesClient.OnConnectionFailedListener {

LocationClient mLocationClient;
Location mCurrentLocation;
LocationRequest mLocationRequest;
LocationListener locationListener;
Handler handler = new Handler();


private static final int MILLISECONDS_PER_SECOND = 1000;
public static final int UPDATE_INTERVAL_IN_SECONDS = 5;
private static final long UPDATE_INTERVAL = MILLISECONDS_PER_SECOND
        * UPDATE_INTERVAL_IN_SECONDS;
private static final int FASTEST_INTERVAL_IN_SECONDS = 1;
private static final long FASTEST_INTERVAL = MILLISECONDS_PER_SECOND
        * FASTEST_INTERVAL_IN_SECONDS;

Context context;

public LocationTracker(Context context) {
    this.context = context;

}

public void getLocation() throws Exception {
    try {
        final int result = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(context);
        if (result != ConnectionResult.SUCCESS) {
            Toast.makeText(
                    context,
                    "Google Play service is not available (status="
                            + result + ")", Toast.LENGTH_LONG).show();

        }
    } catch (Exception e) {
        throw new Exception(e);
    }

    mLocationClient = new LocationClient(context, this, this);
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL);

    mLocationClient.connect();

}

private final class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        // Report to the UI that the location was updated

        // sendLocation(location);

        if (!(location.getLatitude() == mCurrentLocation.getLatitude() && location
                .getLongitude() == mCurrentLocation.getLongitude())) {

            mLocationClient.removeLocationUpdates(locationListener);
            mLocationClient.disconnect();

            //use location as answer

        }
    }
}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    Toast.makeText(context, "Connection Failed", Toast.LENGTH_LONG).show();

}

@Override
public void onConnected(Bundle connectionHint) {

    final LocationManager manager = (LocationManager) context
            .getSystemService(Context.LOCATION_SERVICE);

    if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

        //GPS provider is not enabled
        return;
    }

    locationListener = new MyLocationListener();
    mLocationClient.requestLocationUpdates(mLocationRequest,
            locationListener);
    mCurrentLocation = mLocationClient.getLastLocation();
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (mLocationClient.isConnected()) {
                mLocationClient.removeLocationUpdates(locationListener);
                mLocationClient.disconnect();

                //GPS can not find the location

            }
        }
    }, 2 * 60 * 1000);


}


@Override
public void onDisconnected() {

}

}

于 2014-08-17T13:52:43.583 に答える