2014-09-13 3 views
1

Yesterdy my App работал отлично, но сегодня утром он начал крутиться. Я думаю, что триггер состоял в том, что я перезагрузил свой смартфон, поэтому мой APP выпустил GPS-данные. Я начал режим отладки и выглядел шаг за шагом для значений NULL, и я actuelly найти его с помощью этой команды:Google API - указатель NULL по getLastKnownLocation

myLocation = locationManager.getLastKnownLocation(provider); 

Это возвращает объект NULL, который вызывает к аварии, когда я пытаюсь использовать эти методы:

latitude = myLocation.getLatitude(); 
longtitude = myLocation.getLongitude(); 

Как я могу сделать так, чтобы в этом случае мое местоположение не было NULL? Я попытался использовать NETWORK_PROVIDER, но потом мне нужно использовать WLAN, и это не самый лучший способ, я думаю. Могу ли я по-прежнему получать информацию с помощью GPS_PROVIDER, чтобы не попасть в другое приложение, которое их сохранит?

КСТАТИ вот мой код:

public class gmapps extends FragmentActivity { 

private GoogleMap googleMap; 
TextView txt_street , txt_city , txt_country ; 
Geocoder geocoder; 
List<Address> addresses; 
ImageView btn_yes; 
Location myLocation; 
String address , city , country; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map); 
    txt_street = (TextView)findViewById(R.id.txt_coordinates); 
    txt_city = (TextView)findViewById(R.id.txt_city); 
    txt_country = (TextView)findViewById(R.id.txt_country); 
    btn_yes = (ImageView)findViewById(R.id.btn_yes); 

    setUpIfNeeded(); 

} 

private void setUpIfNeeded() { 
    if (googleMap == null) 
    { 
     try{ 
     googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
    }catch(Exception e){} 

    if (googleMap != null) 
    { 
     setUpMap(); 
    } 

    } 
} 

private void setUpMap() { 

    googleMap.setMyLocationEnabled(true); 

    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    String provider = locationManager.getBestProvider(criteria , true); 

     myLocation = locationManager.getLastKnownLocation(provider);    // Here I get the NULL 

    googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
    double latitude = myLocation.getLatitude(); 
    double longtitude = myLocation.getLongitude(); 
    LatLng latLng = new LatLng(latitude , longtitude); 
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 

    googleMap.animateCamera(CameraUpdateFactory.zoomTo(17)); 


    try { 
     convert_adresses(latitude,longtitude); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    txt_street.setText(address); 
    txt_city.setText(city); 
    txt_country.setText(country); 

} 

public void convert_adresses (double lat , double lng) throws IOException 
{ 
    geocoder = new Geocoder(this, Locale.getDefault()); 
    addresses = geocoder.getFromLocation(lat, lng, 1); 

    address = addresses.get(0).getAddressLine(0); 
    city = addresses.get(0).getAddressLine(1); 
    country = addresses.get(0).getAddressLine(2); 
} 

Спасибо всем!

ответ

0

Сначала вы должны использовать «новый» класс LocationClent (который уже амортизируется в пользу LocationServices).

https://developer.android.com/reference/com/google/android/gms/location/LocationClient.html

Используя это классы getLastLocation(), как правило, делает хорошую работу, но, как сказано в документации (см ниже), он может возвращать нуль в разы, поэтому нужно обязательно чек на это.

Вы также должны сделать запрос на обновление местоположения (см. Документ, упомянутый выше), а затем, когда местоположение устройства станет доступным, он будет вызывать onLocationChanged (Location location) на вашем слушателе, а затем вы можете делать все, что вам нужно сделать это с предоставленным местоположением.

public Location getLastLocation() 

Возвращает лучшее из последних мест в настоящее время. Если местоположение недоступно, что должно произойти очень редко, null будет возвращен. Лучшая точность, доступная при соблюдении разрешений на размещение, будет возвращена. Этот метод обеспечивает упрощенный способ получения местоположения. Он особенно хорошо подходит для приложений, для которых не требуется точное местоположение, и которые не хотят поддерживать дополнительную логику для обновлений местоположения.

Здесь приведен пример использования клиента местоположения.

public class DeviceLocationClient implements 
    GooglePlayServicesClient.ConnectionCallbacks, 
    GooglePlayServicesClient.OnConnectionFailedListener, LocationListener { 

    private Context context; 
    private LocationClient locationClient; 
    private boolean isConnected; 
    private LocationRequest request; 


    @Override 
    public void onLocationChanged(Location location) { 
    System.out.println("got a location update"); 
    if (location != null) { 
     // do something with the location 
    } 
    } 

    public DeviceLocationClient(Context context) { 

    this.context = context; 
    System.out.println("connecting to google play services"); 
    locationClient = new LocationClient(context, this, this); 
    isConnected = false; 
    locationClient.connect(); 

    } 

    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
    System.out.println("connection to google play services FAILED!"); 

    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
    System.out.println("google play servies connected"); 
    isConnected = true; 
    // locationClient.requestLocationUpdates(request, this); 
    request = new LocationRequest(); 
    request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    request.setExpirationDuration(60 * 1000); 
    request.setFastestInterval(5 * 1000); 
    request.setInterval(10 * 1000); 
    isConnected = true; 
    requestLLocationUpdates(); 

    } 

    @Override 
    public void onDisconnected() { 
    // TODO Auto-generated method stub 
    System.out 
     .println("google play services got disconnected - reconnecting"); 
    mBus.unregister(this); 
    locationClient.connect(); 

    } 

    @Subscribe 
    public void onUpdateLocationRequest(UpdateLocationRequest event) { 
    System.out.println("got the location request"); 
    request = new LocationRequest(); 
    request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    request.setExpirationDuration(60 * 1000); 
    request.setFastestInterval(5 * 1000); 
    request.setInterval(10 * 1000); 
    locationClient.removeLocationUpdates(this); 
    locationClient.requestLocationUpdates(request, this); 
    } 

    public void requestLLocationUpdates() { 
    System.out.println("requesting location updates updates"); 

    if (isConnected) { 
     System.out.println("processing request"); 
     System.out.println("sending latest location"); 
     Location lastLocation = locationClient.getLastLocation(); 
     if (lastLocation != null) { 
     // do something with the last location 
     } 
     request = new LocationRequest(); 
     request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     request.setExpirationDuration(60 * 1000); 
     request.setFastestInterval(5 * 1000); 
     request.setInterval(10 * 1000); 
     System.out.println("requesting updates"); 
     locationClient.removeLocationUpdates(this); 
     locationClient.requestLocationUpdates(request, this); 
    } else { 
     if (locationClient.isConnecting()) { 
     System.out.println("google play services is connecting"); 
     } else { 
     System.out 
      .println("attempting to connect to google play services"); 
     locationClient.connect(); 
     } 

    } 
    } 

} 
0

вы можете поставить чек на нулевой указатель, как этот

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 

    String provider = locationManager.getBestProvider(criteria, false); 

    Log.d("FlagLocation", "true"); 

    if (provider != null && !provider.equals("")) { 
     Location location = locationManager.getLastKnownLocation(provider); 
     locationManager.requestLocationUpdates(provider, 20000, 1, this); 
     if (location != null) { 
      double lng = location.getLongitude(); 
      double lat = location.getLatitude(); 
      double kmInLongitudeDegree = 111.320 * Math.cos(lat/180.0 
        * Math.PI); 

      double deltaLat = RADIUS/111.1; 
      double deltaLong = RADIUS/kmInLongitudeDegree; 

      double minLat = lat - deltaLat; 
      double maxLat = lat + deltaLat; 
      double minLong = lng - deltaLong; 
      double maxLong = lng + deltaLong; 


     } 
+0

Итак, если приложение не переписало данные GPS, я не могу получить их и вернуться к ним? Правильно ли я это понял? Когда это будет так, это не лучший способ, не так ли? –

+0

да, вы должны пропустить адрес отелей, хранящихся в вашей базе данных. – Jigar

+0

Нам необходимо изменить нашу базу данных по мере необходимости, если вы хотите обеспечить хорошие функциональные возможности – Jigar

0

Просто получить расположение от поставщика GPS при getLastLocation() == NULL. Взгляните на документацию по Android, которая делает именно то, что вам нужно.

http://developer.android.com/training/location/retrieve-current.html

Позвольте мне знать, если вам нужен какой-то пример кода, и я буду править мой ответ. Надеюсь, это поможет.

Смежные вопросы