无法从播放服务获取位置更新

时间:2016-02-03 08:37:51

标签: java android gps google-play-services

我试图在我的Android应用上从谷歌播放服务请求位置更新。到目前为止,如果我先启动谷歌地图,我就能获得最后的位置,但无法获得任何更新。

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();
    }

}

当我使用谷歌地图后启动应用程序时,我从以下位置获取最后一个缓存位置:

LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

但是之后,我打印出位置服务不可用:

LocationAvailability a = LocationServices.FusedLocationApi.getLocationAvailability(mGoogleApiClient);
System.out.println(a);
永远不会调用

onLocationChanged / onConnectionFailed / onConnectionSuspended。

我在Genymotion上使用Android 5.1.0在虚拟Nexus 6上运行我的应用程序。

1 个答案:

答案 0 :(得分:2)

我想你在这里错过了一些东西。在你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,确保它可以接收位置