0

I am using the HERE MAP SDK and am trying to get the device position. I have an activity inside which a fragment with a map. I can not understand why the NullPointerException error occurs on line 68: m_map.setCenter(posManager.getPosition().getCoordinate(), Map.Animation.NONE);. I'm in onEngineInitializationCompleted and all the elements should have been created, probably ...

Here is the fragment code:

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

import com.here.android.mpa.common.Image;
import com.here.android.mpa.common.OnEngineInitListener;
import com.here.android.mpa.common.PositioningManager;
import com.here.android.mpa.mapping.Map;
import com.here.android.mpa.mapping.MapMarker;
import com.here.android.mpa.mapping.SupportMapFragment;

import java.io.File;
import java.io.IOException;

public class MapFragmentView {
    private SupportMapFragment m_mapFragment;
    private Map m_map;
    private MapMarker m_map_marker;
    private AppCompatActivity m_activity;


    public MapFragmentView(SupportMapFragment m_mapFragment, AppCompatActivity activity) {
        this.m_mapFragment = m_mapFragment;
        m_activity = activity;
        initMapFragment();
    }

    private void initMapFragment() {
        // Set path of isolated disk cache
        String diskCacheRoot = Environment.getExternalStorageDirectory().getPath()
                + File.separator + ".isolated-here-maps";
        // Retrieve intent name from manifest
        String intentName = "";
        try {
            ApplicationInfo ai = m_activity.getPackageManager().getApplicationInfo(m_activity.getPackageName(), PackageManager.GET_META_DATA);
            Bundle bundle = ai.metaData;
            intentName = bundle.getString("INTENT_NAME");
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(this.getClass().toString(), "Failed to find intent name, NameNotFound: " + e.getMessage());
        }

        if (m_mapFragment != null) {
            /* Initialize the SupportMapFragment, results will be given via the called back. */
            m_mapFragment.init(new OnEngineInitListener() {
                @Override
                public void onEngineInitializationCompleted(OnEngineInitListener.Error error) {

                    if (error == Error.NONE) {
                        /*
                         * If no error returned from map fragment initialization, the map will be
                         * rendered on screen at this moment.Further actions on map can be provided
                         * by calling Map APIs.
                         */
                        m_map = m_mapFragment.getMap();

                        createMapMarker();

                        PositioningManager posManager = PositioningManager.getInstance();
                        posManager.start(PositioningManager.LocationMethod.GPS_NETWORK);
                        m_map.setCenter(posManager.getPosition().getCoordinate(), Map.Animation.NONE);

                        // Display position indicator
                        m_map.getPositionIndicator().setVisible(true);
                    }
                }
            });
        }
    }


    /**
     * create a MapMarker and add the MapMarker to active map view.
     */
    public void createMapMarker() {
        // create an image from cafe.png.
        Image marker_img = new Image();
        try {
            marker_img.setImageResource(R.drawable.map_icon);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // create a MapMarker centered at current location with png image.
        m_map_marker = new MapMarker(m_map.getCenter(), marker_img);
        // add a MapMarker to current active map.
        m_map.addMapObject(m_map_marker);
    }
}

Full error code:

java.lang.NullPointerException: Attempt to invoke virtual method 'com.here.android.mpa.common.GeoCoordinate com.here.android.mpa.common.GeoPosition.getCoordinate()' on a null object reference
        at cs.iqueue.MapFragmentView$2.onEngineInitializationCompleted(MapFragmentView.java:68)
  • It's returning `null` as it doesn't have a current position for you. You need to check first with `hasValidPosition()` [as recommended in the documentation](https://www.developer.here.com/documentation/android-premium/api_reference_java/com/here/android/mpa/common/PositioningManager.html#getPosition--), and use `getLastKnownPosition()` if not. – Michael Dodd Jan 18 '19 at 21:14

1 Answers1

0

This is happening because posManager.getPosition() returns null. You need to ensure that the code:

  1. doesn't return null, or
  2. doesn't call getCoordinate() in the event that posManager.getPosition() returns null.
entpnerd
  • 10,049
  • 8
  • 47
  • 68