0

我想要检索当前用户位置,以便将用户指向地图上,因为这是模拟器第一次获取用户位置LocationServices。 FusedLocationApi.getLastLocation(mGoogleApiClient)返回空位置。然后,我尝试使用此LocationServices.FusedLocationApi.requestLocationUpdates获取位置,但是当我调试应用程序时,应用程序在调试窗口中说该应用程序正在运行,所以我猜测它无法将位置返回到onLocationChanged(位置位置)函数。Android:LocationServices.FusedLocationApi.requestLocationUpdates保持运行,不返回

当运行不调试它应用程序,它给出了这样的错误

2月8日至25日:44:06.988 2976年至2985年/ com.example.bkoseoglu.findlocation d/dalvikvm:GC_FOR_ALLOC释放< 1K,10%的游离13564K/14988K,暂停 21ms,共21ms

2月8日至25日:44:07.128 2976-3013/com.example.bkoseoglu.findlocation d/dalvikvm:GC_FOR_ALLOC释放4228K,37%的游离9469K/14988K,暂停 5ms,总共5ms

08-25 02:44:07.128 2976-3013/com.example.bkoseoglu.findlocation I/dalvikvm堆:成长堆(FRAG情况下),以13.397MB为4194316字节 分配

08-25 02:44:07.148 2976-3013/com.example.bkoseoglu.findlocation d/dalvikvm:GC_FOR_ALLOC释放< 1K,10%免费13564K/14988K,暂停 为20ms,20ms的总

你知道什么事情是原因,我怎么可以检索位置onLocationChanged ???我也复制并粘贴下面的代码,因为更新的设置,间隔或其他内容可能有问题。

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener,LocationListener { 

@Override 
public void onLocationChanged(Location location) { 
    handleNewLocation(location); 
} 

private GoogleApiClient mGoogleApiClient; 
public static final String TAG = MapsActivity.class.getSimpleName(); 
private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 
private LocationRequest mLocationRequest; 
private GoogleMap mMap; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //updateValuesFromBundle(savedInstanceState) 
    setContentView(R.layout.activity_maps); 
    // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    // Create the LocationRequest object 
    mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setInterval(10 * 1000)  // 10 seconds, in milliseconds 
      .setFastestInterval(1 * 1000); // 1 second, in milliseconds 
} 

/*private void updateValuesFromBundle(Bundle savedInstanceState) { 
    if (savedInstanceState != null) { 
     // Update the value of mRequestingLocationUpdates from the Bundle, and 
     // make sure that the Start Updates and Stop Updates buttons are 
     // correctly enabled or disabled. 
     if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) { 
      mRequestingLocationUpdates = savedInstanceState.getBoolean(
        REQUESTING_LOCATION_UPDATES_KEY); 
      setButtonsEnabledState(); 
     } 

     // Update the value of mCurrentLocation from the Bundle and update the 
     // UI to show the correct latitude and longitude. 
     if (savedInstanceState.keySet().contains(LOCATION_KEY)) { 
      // Since LOCATION_KEY was found in the Bundle, we can be sure that 
      // mCurrentLocationis not null. 
      mCurrentLocation = savedInstanceState.getParcelable(LOCATION_KEY); 
     } 

     // Update the value of mLastUpdateTime from the Bundle and update the UI. 
     if (savedInstanceState.keySet().contains(LAST_UPDATED_TIME_STRING_KEY)) { 
      mLastUpdateTime = savedInstanceState.getString(
        LAST_UPDATED_TIME_STRING_KEY); 
     } 
     updateUI(); 
    } 
}*/ 
/*public void onSaveInstanceState(Bundle savedInstanceState) { 
    savedInstanceState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, 
      mRequestingLocationUpdates); 
    savedInstanceState.putParcelable(LOCATION_KEY, mCurrentLocation); 
    savedInstanceState.putString(LAST_UPDATED_TIME_STRING_KEY, mLastUpdateTime); 
    super.onSaveInstanceState(savedInstanceState); 
}*/ 
protected void startLocationUpdates() { 
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     // TODO: Consider calling 
     // ActivityCompat#requestPermissions 
     // here to request the missing permissions, and then overriding 
     // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
     //           int[] grantResults) 
     // to handle the case where the user grants the permission. See the documentation 
     // for ActivityCompat#requestPermissions for more details. 
     return; 
    } 
    if(CheckGps()) { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 
    else{ 
     Log.d("GPS NOT ENABLED ", "GPS NOT ENABLED "); 
    } 
} 
/** 
* Manipulates the map once available. 
* This callback is triggered when the map is ready to be used. 
* This is where we can add markers or lines, add listeners or move the camera. In this case, 
* we just add a marker near Sydney, Australia. 
* If Google Play services is not installed on the device, the user will be prompted to install 
* it inside the SupportMapFragment. This method will only be triggered once the user has 
* installed Google Play services and returned to the app. 
*/ 
@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 

    // Add a marker in Sydney and move the camera 
    LatLng sydney = new LatLng(-34, 151); 
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
} 



@Override 
public void onConnected(@Nullable Bundle bundle) { 

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     // TODO: Consider calling 
     // ActivityCompat#requestPermissions 
     // here to request the missing permissions, and then overriding 
     // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
     //           int[] grantResults) 
     // to handle the case where the user grants the permission. See the documentation 
     // for ActivityCompat#requestPermissions for more details. 
     return; 
    } 
    Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() 
      .addLocationRequest(mLocationRequest); 

    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, 
        builder.build()); 
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
     @Override 
     public void onResult(LocationSettingsResult result) { 
      final Status status = result.getStatus(); 
      final LocationSettingsStates locationSettingsStates = result.getLocationSettingsStates(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 
        // All location settings are satisfied. The client can 
        // initialize location requests here. 
        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        // Location settings are not satisfied, but this can be fixed 
        // by showing the user a dialog. 
        try { 
         // Show the dialog by calling startResolutionForResult(), 
         // and check the result in onActivityResult(). 
         status.startResolutionForResult(
           MapsActivity.this, 
           6); 
        } catch (IntentSender.SendIntentException e) { 
         // Ignore the error. 
        } 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        // Location settings are not satisfied. However, we have no way 
        // to fix the settings so we won't show the dialog. 
        break; 
      } 
     } 
    }); 

    if (location == null) { 
     startLocationUpdates(); 
    } 
    else { 
     handleNewLocation(location); 
    }; 
} 
public void handleNewLocation(Location location){ 
    Log.d(TAG, location.toString()); 

    double currentLatitude = location.getLatitude(); 
    double currentLongitude = location.getLongitude(); 
    LatLng latLng = new LatLng(currentLatitude, currentLongitude); 

    MarkerOptions options = new MarkerOptions() 
      .position(latLng) 
      .title("I am here!"); 
    mMap.addMarker(options); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
} 

@Override 
public void onConnectionSuspended(int i) { 
} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    if (connectionResult.hasResolution()) { 
     try { 
      // Start an Activity that tries to resolve the error 
      connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST); 
     } catch (IntentSender.SendIntentException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode()); 
    } 
} 
@Override 
protected void onResume() { 
    super.onResume(); 
    //setUpMapIfNeeded(); 
    mGoogleApiClient.connect(); 
} 
@Override 
protected void onPause() { 
    super.onPause(); 
    if (mGoogleApiClient.isConnected()) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     mGoogleApiClient.disconnect(); 
    } 
} 
boolean CheckGps(){ 
    LocationManager lm = (LocationManager)MapsActivity.this.getSystemService(MapsActivity.this.LOCATION_SERVICE); 
    boolean gps_enabled = false; 
    boolean network_enabled = false; 

    try { 
     gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    } catch(Exception ex) {} 

    try { 
     network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
    } catch(Exception ex) {} 

    if(!gps_enabled && !network_enabled) { 
     return false; 
    } 
    else{ 
     return true; 
    } 
} 
} 

谢谢。

+0

import android.content.IntentSender; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentActivity; import android.os.Bundle; import android.util.Log; –

+0

import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.PendingResult; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.android.gms.location.LocationListener; –

+0

这些是导入com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; import com.google.android.gms.location.LocationSettingsRequest; import com.google.android.gms.location.LocationSettingsResult; import com.google.android.gms.location。LocationSettingsStates; import com.google.android.gms.location.LocationSettingsStatusCodes; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; –

回答

0

首先,我会建议尝试在真实的设备,如果可能的话。如果没有,那么确保你已经为你的模拟器设置了纬度/经度。这是一个非常好的指导如何做到这一点How to emulate GPS location in the Android Emulator?

+0

我已经修复了仿真器的纬度和长度,但是通过连接telnet和仿真器来使用命令行,但位置位置= LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);仍然返回一个空值位置。 –

+0

@ B.Koseoglu有无论如何,你可以尝试在设备中的应用程序? –