2015-08-28 2 views
0

Я пытаюсь добраться до последнего известного местоположения с помощью GoogleApiClient, когда начинается деятельность Map. Я последовал за руководство в ссылке:com.google.android.gms.maps.GoogleMap.addMarker (com.google.android.gms.maps.model.MarkerOptions) 'на ссылке нулевого объекта

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

Это работает, но приложение craches когда-то и я получаю ошибку ниже:

Как я могу это исправить?

Ошибка:

08-28 16:10:11.687: E/AndroidRuntime(5937): FATAL EXCEPTION: main 
08-28 16:10:11.687: E/AndroidRuntime(5937): Process: com.bustracker, PID: 5937 
08-28 16:10:11.687: E/AndroidRuntime(5937): java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.bustracker.Map.onConnected(Map.java:494) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.google.android.gms.common.internal.zzj.zzg(Unknown Source) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.google.android.gms.common.api.zze.zzmH(Unknown Source) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.google.android.gms.common.api.zze.onConnected(Unknown Source) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.google.android.gms.common.api.zzg$2.onConnected(Unknown Source) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.google.android.gms.common.internal.zzi$zzg.zznO(Unknown Source) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.google.android.gms.common.internal.zzi$zza.zzc(Unknown Source) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.google.android.gms.common.internal.zzi$zza.zzr(Unknown Source) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.google.android.gms.common.internal.zzi$zzc.zznQ(Unknown Source) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.google.android.gms.common.internal.zzi$zzb.handleMessage(Unknown Source) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at android.os.Handler.dispatchMessage(Handler.java:102) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at android.os.Looper.loop(Looper.java:145) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at android.app.ActivityThread.main(ActivityThread.java:5944) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at java.lang.reflect.Method.invoke(Native Method) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at java.lang.reflect.Method.invoke(Method.java:372) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389) 
08-28 16:10:11.687: E/AndroidRuntime(5937):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184) 

Карта активности:

ответ

1

Я думаю, вы получите onConnected обратного вызова начинается до onMapReady

Попытка вызвать mGoogleApiClient.connect() внутри ваш ответ onMapReady, чтобы убедиться, что ma p не равно нулю.

Если вы не хотите использовать асинхронную установку правильно, просто получите карту с синхронизацией.

удалить это mapFragment.getMapAsync(this);
и добавить map = mapFragment.getMap();

Убедитесь, что у вас есть поле GoogleMap map, потому что вы прячете его в коде.

Или это еще одна версия

public class Map extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 
    GoogleMap map; 
    GoogleApiClient mGoogleApiClient; 
    Location mLastLocation; 
    Marker myLocatMarker; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map); 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
     buildGoogleApiClient(); 
     mapFragment.getMapAsync(new OnMapReadyCallback() { 
      @Override 
      public void onMapReady(GoogleMap googleMap) { 
       map = googleMap; 
       mGoogleApiClient.connect(); 
      } 
     }); 
    } 

    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
     System.out.println("ABC buildGoogleApiClient map was invoked: "); 
    } 

    @Override 
    public void onConnected(Bundle arg0) { 
     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     if (mLastLocation != null) { 
      double lng = mLastLocation.getLongitude(); 
      double lat = mLastLocation.getLatitude(); 

      if (myLocatMarker != null) { 
       myLocatMarker.remove(); 
      } 
      LatLng ll = new LatLng(lat, lng); 
      MarkerOptions markerOpt = new MarkerOptions().title("my location") 
        .position(ll) 
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.myloc)); 
      System.out.println("ABC onConnected map: " + lat + " ; " + lng); 
      myLocatMarker = map.addMarker(markerOpt); 
     } 
    } 
} 
+0

я попробовал ваше предложение, но обратного вызова 'onMapReady() 'не вызывается. Я вызываю 'getMapAsync' в' onCreate() '! –

+0

mapView.getMapAsync (новый OnMapReadyCallback() { public void onMapReady (GoogleMap googleMap) { } }); –

+0

вы должны получить карту в OnMapReady, или она всегда будет пустой –

0

Это потому, что ваш объект карты не определен и инициализирован. Объявить глобально, как,

GoogleMap map;
и инициализировать его, как показано ниже ..
 SupportMapFragment supportMapFragment = 
 
       (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
 
     map = mapFragment.getMap();

+0

Я уже инициализирован его в initMap() Я не добавил код wohle активности, потому что в долгосрочной –

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