2015-07-16 7 views
1

Я использую API Карт Google в своем приложении для Android и размещаю пользователя с LocationManager и getLongitude(), getLatitude(). Но теперь на мобильном телефоне должны быть странные настройки, чтобы получить карту. Настройка местоположения должна быть изменена только для использования GPS, и даже тогда она не работает все время, иногда карта не загружается. Если не загружено приложение закрывается в точке, первый маркер устанавливается из-за NullPointerException.Карты API только загружаются с настройкой местоположения GPS

Почему это и как я могу предотвратить это? Я уже пробовал с getMapAsync, но это не помогло.

GoogleMap googleMap; 
LocationManager locationManager; 
String provider; 
Criteria criteria; 
Location myLocation; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); 

    try { 
     if(googleMap == null) { 
      googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
     } 
     googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     googleMap.setMyLocationEnabled(true); 
     googleMap.setTrafficEnabled(true); 
     googleMap.setIndoorEnabled(true); 
     googleMap.setBuildingsEnabled(true); 
     googleMap.getUiSettings().setZoomControlsEnabled(true); 

     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     criteria = new Criteria(); 
     provider = locationManager.getBestProvider(criteria, true); 
     myLocation = locationManager.getLastKnownLocation(provider); 
     double latitude = myLocation.getLatitude(); 
     double longitude = myLocation.getLongitude(); 
     LatLng latLng = new LatLng(latitude, longitude); 
     googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
     googleMap.animateCamera(CameraUpdateFactory.zoomTo(14)); 
     iconDone = R.drawable.markerdone; 
     icon = R.drawable.marker; 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 

    Marker marker1 = googleMap.addMarker(new MarkerOptions() 
      .position(new LatLng(49.793012, 9.926201)) 
      .title(getString(R.string.Title1)) 
      .snippet("") 
      .icon(BitmapDescriptorFactory.fromResource(icon))); 
+0

Показать код, чтобы дать лучшее понимание того, почему ваша проблема происходит. Вы используете FusedLocationProvider? –

+0

он не загружается при первом открытии приложения? или после перехода на другую активность/фрагмент? и он не загружается и не падает (если это так, зарегистрируйте свой logcat)! или он загружается без какого-либо контента? уточните свой вопрос, пожалуйста. помогите нам помочь –

ответ

1

Проблема заключается в том, что вы звоните getLastKnownLocation(), который часто возвращает нуль Location, так как он не явно запросить новый замок местоположение.

Итак, когда ваше приложение рушится, это связано с исключением NullPointerException при попытке удалить ссылку на объект Location.

Лучше всего запросить обновление местоположения, и если вам нужно только один, только отменит регистрацию геоданных после того, как первый onLocationChanged() обратного вызов приходит.

Ниже приведен пример использования API FusedLocationProvider, который автоматически использует сеть Расположение, а также местоположения GPS, если это необходимо:

Релевантного импорт для деятельности:

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.CameraPosition; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 

активность:

public class MainActivity extends AppCompatActivity 
     implements OnMapReadyCallback, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, LocationListener { 


    GoogleMap googleMap; 
    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    Marker marker; 

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     buildGoogleApiClient(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 

     mapFragment.getMapAsync(this); 
    } 

    protected synchronized void buildGoogleApiClient() { 
     Toast.makeText(this,"buildGoogleApiClient", Toast.LENGTH_SHORT).show(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 

     googleMap = map; 

     setUpMap(); 

    } 

    public void setUpMap() { 

     googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     googleMap.setMyLocationEnabled(true); 
     googleMap.getUiSettings().setZoomControlsEnabled(true); 

    } 

    @Override 
    public void onConnected(Bundle bundle) { 

     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(10); 
     mLocationRequest.setFastestInterval(10); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
     //mLocationRequest.setSmallestDisplacement(0.1F); 

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

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onLocationChanged(Location location) { 

     //unregister location updates 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 

     //remove previously placed Marker 
     if (marker != null) { 
      marker.remove(); 
     } 

     LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
     //place marker where user just clicked 
     marker = googleMap.addMarker(new MarkerOptions() 
       .position(latLng) 
       .title("Current Location") 
       .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA))); 

     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(latLng).zoom(5).build(); 

     googleMap.animateCamera(CameraUpdateFactory 
       .newCameraPosition(cameraPosition)); 


    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 

    } 

} 

build.gradle (изменение какой-либо версии сервисов Google Play вы используете):

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile 'com.google.android.gms:play-services:7.5.0' 
} 

SupportMapFragment в макете XML (вы можете использовать MapFragment а):

<fragment 
    android:id="@+id/map" 
    class="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

Использование только сети Расположение:

enter image description here

Карта перемещается к текущей секунде местоположения после запуска:

enter image description here

+0

Я сделал все как вы, но по методу onLocationChanged он дает мне ошибку, говоря, что «метод не отменяет метод из своего суперкласса». – maidi

+0

Где бы вы установили 'setOnInfoClickListener', если я использую текущее местоположение в нем знать, что пользователь находится рядом с маркером? – maidi

+0

@maidi Я просто обновил форматирование, чтобы вы могли видеть все интерфейсы, которые Activity реализует без прокрутки, посмотрите! Также убедитесь, что вы импортировали корректный файл LocationListener: 'import com.google.android.gms.location.LocationListener; ' –