15

So I have implemented the new Fused Location Provider API to get a location of the user but for some reason, I cannot get any location unless the GPS is on. Not always, will users have their GPS on and I would like to not have to ask them to turn their GPS on every time the load the app. How can I tell the API to give me a location with whatever provider it has available?

Here is my code:

public class FusedLocationService implements
        LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    public interface OnLocationChangedListener {
        public void OnLocationChanged(Location location);
    }

    private final String TAG = "SE8611";
    private boolean mRequestingLocationUpdates = true;

    private OnLocationChangedListener mCallBack;

    Service locationService;
    private LocationRequest locationRequest;
    private GoogleApiClient googleApiClient;
    private Location mCurrentLocation;
    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;

    public FusedLocationService(Service locationService, final long INTERVAL, final long FASTEST_INTERVAL) {
        Logger.log(TAG, "FusedLocationService called");

        this.mCallBack = (OnLocationChangedListener)locationService;

        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(INTERVAL);
        locationRequest.setFastestInterval(FASTEST_INTERVAL);
        this.locationService = locationService;

        googleApiClient = new GoogleApiClient.Builder(locationService)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        if (googleApiClient != null) {
            googleApiClient.connect();
        }
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        if(mRequestingLocationUpdates) {
            startLocationUpdates();
        }else{
            Logger.log(TAG, "Location updates are already running.");
        }
    }

    protected void startLocationUpdates() {
        this.fusedLocationProviderApi.requestLocationUpdates(
                googleApiClient, locationRequest, this);
        this.mRequestingLocationUpdates = false;
    }

    @Override
    public void onLocationChanged(Location mCurrentLocation) {
        Logger.log(TAG, "onLocationChanged called");
        this.mCurrentLocation = mCurrentLocation;
        this.mCallBack.OnLocationChanged(this.mCurrentLocation);
    }

    public void startLocationUpdatesAfterResume(){
        if (googleApiClient.isConnected() && !mRequestingLocationUpdates) {
            Logger.log(TAG, "startLocationUpdatesAfterResume called");
            this.startLocationUpdates();
        }
    }

    public void stopLocationUpdates() {
        Logger.log(TAG, "stopping Location Updates");
        LocationServices.FusedLocationApi.removeLocationUpdates(
                googleApiClient, this);
    }

    public Location getLocation() {
        return this.mCurrentLocation;
    }

    @Override
    public void onConnectionSuspended(int i) {
        this.mRequestingLocationUpdates = true;
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        this.mRequestingLocationUpdates = true;
    }
}
4

3 に答える 3

11

私はあなたと同じ問題を抱えていましたが、これはまったく問題ではありません。Androidには、直接制御できるGPSボタンがありましたが、動作が異なる場所ボタンに置​​き換えられました. 任意のタイプの場所を取得するには、オンにする必要があります。あなたと同じように、Location ボタンは GPS のみをオンまたはオフにすると思っていましたが、そうではありません。位置モードを変更して GPS を制御できます。 1. 高精度 (GPS、Wi-Fi、およびモバイル ネットワーク) 2. 省電力 (Wi-Fi およびモバイル ネットワーク) 3. GPS のみ

于 2016-11-10T16:38:05.837 に答える
3

問題の解決策を見つけたと思います。

[設定] -> [プライバシーと安全性] -> [位置情報] に移動すると、位置情報が GPS だけでなく、実際にユーザーが使用できるプロバイダーを決定できることがわかります。たとえば、場所の取得に WiFi とセルラーのみを使用するように設定できます。

位置情報オプションを無効にすると、GPS だけでなく、すべてのプロバイダーが一度に無効になります。

WiFi のみを使用して位置情報を取得できるユーザーのアプリをテストするには、設定を「Wifi+Cellular」に変更します。

于 2016-09-17T20:30:17.260 に答える
0

を使用しているようですLocationRequest.PRIORITY_HIGH_ACCURACY。これは、他の方法よりも GPS を使用することを好みます。PRIORITY_BALANCED_POWER_ACCURACYGPS を使用する前に、WiFi とセルタワーを使用するを使用することをお勧めします。

また、PRIORITY_BALANCED_POWER_ACCURACY精度の「粗い」レベルであるため、マニフェストの場所の許可を適切に変更することをお勧めします。

トレーニング ドキュメントには、優先度フラグに関する詳細が記載されています。

于 2015-02-19T04:34:21.970 に答える