簡體   English   中英

無法從播放服務獲取位置更新

[英]Unable to get location updates from play services

我正在嘗試從我的Android應用程序上的Google Play服務請求位置更新。 到目前為止,如果我先啟動谷歌地圖,我將能夠獲得最后的位置,但無法獲得任何更新。

public class Inbox extends AppCompatActivity implements
GoogleApiClient.ConnectionCallbacks, 
GoogleApiClient.OnConnectionFailedListener,
com.google.android.gms.location.LocationListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        int r = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this);
        if(r != 0){
            System.out.println(r);
            Dialog d = GoogleApiAvailability.getInstance().getErrorDialog(this,r,1);
            d.show();
        }
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .addApi(AppIndex.API).build();
        }
        mGoogleApiClient.connect();
        super.onStart();
    }

    @Override
    public void onConnected(Bundle bundle) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            System.out.println("Problem with rights");
        }
        else{
            Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            LocationRequest mLocationRequest = new LocationRequest();

                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

            if(mLastLocation != null){
                System.out.println(mLastLocation.toString());
            }
            else {
                System.out.println("No location cached");
            }
            LocationAvailability a = LocationServices.FusedLocationApi.getLocationAvailability(mGoogleApiClient);
            System.out.println(a);
        }
    }


    @Override
    public void onConnectionSuspended(int i) {
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
    }
    @Override
    public void onLocationChanged(Location location) {
        System.out.println(location.toString());
    }




    @Override
    public void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
        Action viewAction = Action.newAction(...);
        AppIndex.AppIndexApi.start(mGoogleApiClient, viewAction);
    }

    @Override
    public void onStop() {
        super.onStop();
        Action viewAction = Action.newAction(...);
        AppIndex.AppIndexApi.end(mGoogleApiClient, viewAction);
        mGoogleApiClient.disconnect();
    }

}

當我使用Google地圖后啟動應用程序時,我從以下位置獲取了最后一個緩存的位置:

LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

但是,在此之后,我立即打印出定位服務不可用:

LocationAvailability a = LocationServices.FusedLocationApi.getLocationAvailability(mGoogleApiClient);
System.out.println(a);

永遠不會調用onLocationChanged / onConnectionFailed / onConnectionSuspended。

我在Genymotion上使用Android 5.1.0的虛擬Nexus 6上運行我的應用程序。

我想你在這里錯過了幾件事。 在onCennected回調中,您必須首先檢查是否可以獲取上一個已知位置。 如果不可用,則必須請求位置更新。 如下所示重構您的onConnected,它應該可以正常工作

@Override
    public void onConnected(Bundle bundle) {
        if (ActivityCompat.checkSelfPermission(this, 
           Manifest.permission.ACCESS_FINE_LOCATION) != 
           PackageManager.PERMISSION_GRANTED && 
           ActivityCompat.checkSelfPermission(this, 
           Manifest.permission.ACCESS_COARSE_LOCATION) != 
           PackageManager.PERMISSION_GRANTED) {
               System.out.println("Problem with rights");
        } else {

           Location lastLocation = LocationServices.FusedLocationApi
                                       .getLastLocation(mGoogleApiClient);

           if (lastLocation != null) {
            //you have a location. use that here. no need to request for location 
            // updates
            mGoogleApiClient.disconnect();
           } else {
            //you have to request for location
             mLocationRequest = LocationRequest.create();
             mLocationRequest.setInterval(2000);
             mLocationRequest.setFastestInterval(1000);
             mLocationRequest.setSmallestDisplacement(50);
             mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
             LocationServices.FusedLocationApi
               .requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

           }

        }
    }

然后在你的locationChanged回調中執行以下操作

@Override
public void onLocationChanged(Location location) {

    //now that we got the initial location. it is time to stop the api client
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
    mGoogleApiClient.disconnect();

   // use your newly obtained location here

}

注意:如果您在GenyMotion上嘗試此操作。 通過在GM仿真器上啟用GPS,確保它可以接收位置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM