2016-11-30 18 views
0

私はアンドロイドのgoogle maps apiにマーカーを追加するためのオンラインチュートリアルに従ってきました。コードは私とは違った構造になっていますが、一般的にはonCreateメソッドでコードが実行されています。私はマップの真ん中でマーカーを取得しようとする本当に基本的なコードを持っていますが、私はnullポインタ例外を取得します。誰もがこれに簡単な修正を知っていますか?Google apiにマーカーを追加

エラーの詳細は以下のとおりです。私はグローバル変数として宣言されたマップを持っています。

java.lang.NullPointerExceptionが仮想メソッドを呼び出す試み「com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android nullオブジェクト参照

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    serviceManager = ServiceManager.getInstance(getActivity()); 
    userID = getString(R.string.mobile_health_client_user_id); 
    client = MobileIOClient.getInstance(getContext(), userID); 
    //client = MobileIOClient.getInstance(userID); 
    map.addMarker(new MarkerOptions() 
      .position(new LatLng(0, 0)) 
      .title("Hello world")); 
} 

上.gms.maps.model.MarkerOptions)は、」私も()onMapReadyを上書きし、Googleのチュートリアルを走ってきたが、その方法は、いずれかの私のために動作しませんでした。私は自分のコードでそれを動作させる方法がわかりませんし、私を助けるためにオンラインで十分なリソースを見つけることができません。どんな助けもありがとう。ここで

おかげ

+0

に以下の答えは、あなたがOnMapReadyCallback内のマップを取得する方法を示しています。次に、地図にマーカーを追加することができます – ganlaw

答えて

1

あなたは、あなたの活動のマップオブジェクトまたはフラグメントののonCreate()メソッドと対話すべきではありません。単純な推論は、おそらく地図がまだ準備が整っていないことである。これを処理する適切な方法は、OnMapReadyCallbackインターフェイスを実装し、onMapReady(GoogleMap googleMap)関数の実装にマーカーを追加することです。

MapFragmentMapViewを使用している場合、ソリューションは若干異なる必要がありますが、一般的な考え方は変わりません。

例:

public class MyActivity extends Activity implements OnMapReadyCallback { 
    . 
    . 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     map = googleMap; // Set your local instance of GoogleMap for future use 
     map.addMarker(new MarkerOptions() 
      .position(new LatLng(0, 0)) 
      .title("Hello world")); 
    } 
    . 
    . 
} 

あなたがMapViewを使用している場合、あなたはあなたのレイアウトでビューへのハンドルを取得し、明示的にonMapReady()リスナーを取り付けるためにmap.getMapAsync(this)を呼び出す必要があります。

こちらがお役に立てば幸いです。

1

は、私が使用するコードは次のとおりです。

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

private GoogleMap mMap; 
public GoogleApiClient mGoogleApiClient; 
public static final String TAG = Map.class.getSimpleName(); 
public LocationRequest mLocationRequest; 
double latitude; 
double longitude; 

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

    // 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 

} 


/** 
* 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. 
* 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; 


    LatLng here = new LatLng(latitude,longitude); 
    mMap.addMarker(new MarkerOptions().position(here).title("Here!")); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(here)); 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    Log.i(TAG, "Location services connected."); 
    Location location = null; 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    } 

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

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

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

} 

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

private void handleNewLocation(Location location) { 
    Log.d(TAG, location.toString()); 
    latitude = location.getLatitude(); 
    longitude = location.getLongitude(); 
    LatLng latLng = new LatLng(latitude,longitude); 

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

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

書き込み単にonMapReady
googleMap.addMarker(new MarkerOptions().position(new LatLng(0, 0));

関連する問題