2016-10-15 6 views
0

私は単純なGoogle Maps Androidチュートリアルに従っていますが、Googleマップオブジェクトに問題があります。onLocationChangedメソッドがnullの場合のように見えます私はそのメソッド内のnullオブジェクトをチェックしようとしましたが、マーカーを設定しません。Googleマップはnullに設定されていますonLocationChanged

これはonLocationChangedを使用する方法ですか?私がGoogleから見たコメントは、onMapReady関数がマーカーとリスナーの追加に使用されていることを示しているためです。 LocationListenerを別の方法で接続する必要がありますか? documentationから

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

    public static final String TAG = MapsActivity.class.getSimpleName(); 

    private static final int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 

    private GoogleMap mMap; 
    private GoogleApiClient mGoogleApiClient; 
    private LocationRequest mLocationRequest; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(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); 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 

     // Create a LocationRequest object 
     mLocationRequest = LocationRequest.create() 
       .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
       .setInterval(10 * 1000)  // 10 seconds, in milliseconds 
       .setFastestInterval(1 * 1000); // 1 second, in milliseconds 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

     // no prior location 
     if(location == null) { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     } else { 
      handleNewLocation(location); 
     } 

     double latitude = location.getLatitude(); 
     double longitude = location.getLongitude(); 

     Log.i(TAG, "Latitude: " + latitude + " Longitude" + longitude); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Log.i(TAG, "LocationServices has been suspended. Please reconnect"); 
    } 

    @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(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if(mGoogleApiClient.isConnected()) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    private void handleNewLocation(Location location) { 

     double currentLatitude = location.getLatitude(); 
     double currentLongitude = location.getLongitude(); 

     LatLng latLng = new LatLng(currentLatitude, currentLongitude); 

     MarkerOptions markerOptions = new MarkerOptions().position(latLng).title("I am here!"); 

     mMap.addMarker(markerOptions); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 

    } 

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

}

+0

ここにワーキングコード:http://stackoverflow.com/questions/34582370/how-can-i-show-current-location-on-a-google-map-on-android-marshmallow –

答えて

0

A GoogleマップはgetMapAsync(OnMapReadyCallback)を使用して取得されなければなりません。 このクラスは、マップシステムとビューを自動的に初期化します。

getMapAsync()コールがありません。 onCreate()に追加する必要があります。

そして、あなたはそれからonMapReady()に真mapReady = true;にブール値を設定し、
if (mapReady) { // Do stuff }
またはちょうどをチェックできるのいずれか、それを使用しているときは常に
if (mMap != null) { // Do stuff }
をご確認ください。

それ以外の場合、コードは一目瞭然ですが、実際には私の頭の中でそれをデバッグしませんでした。

1

onMapReady()内に位置リスナーを追加する必要があります。そのため、Googleマップの後に位置変更のコールバックを取得できるようになります。

関連する問題