What i do: i use Nokia Here-maps wrapper v2 to display a map with one custom marker and the user's position. Then i use PolyLines to draw direction between those 2 points. All works fine with Google Play Services but on Nokia X i can't get user location, call to setMyLocationEnabled on the map object throws :
java.lang.IllegalArgumentException: provider doesn't exisit: null at android.os.Parcel.readException(Parcel.java:1435) at android.os.Parcel.readException(Parcel.java:1385) at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:540) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:836) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:430) at com.nokia.maps.DeviceLocation.M(DeviceLocation.java:380) at com.nokia.maps.DeviceLocation.start(DeviceLocation.java:107) at com.nokia.maps.PositioningManager.start(PositioningManager.java:171) at com.nokia.android.gms.maps.GoogleMap.setPositionManagerEnabled(GoogleMap.java:1442) at com.nokia.android.gms.maps.GoogleMap.setMyLocationEnabled(GoogleMap.java:1420) at com.nokia.android.gms.maps.GoogleMap.onInitializationComplete(GoogleMap.java:696) at com.nokia.android.gms.maps.MapView.attachMapToMapViewSetup(MapView.java:293) at com.nokia.android.gms.maps.MapView.access$19(MapView.java:271) at com.nokia.android.gms.maps.MapView$4.onFactoryInitializationCompleted(MapView.java:263) at com.nokia.maps.MapFactory$2.run(MapFactory.java:455)
Manifest
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:hardwareAccelerated="true" >
<uses-library android:name="com.here.android" android:required="false" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="MY_GOOGLE_APIV2_KEY"/>
<meta-data android:name="com.here.android.maps.appid" android:value="MY_HERE_APPID" />
<meta-data android:name="com.here.android.maps.apptoken" android:value="MY_HERE_TOKEN" />
<activity
android:name=".MapsFragmentActivity"
android:label="@string/title_activity_maps" >
</activity>
</application>
Map fragment layout
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
android:name="com.nokia.android.gms.maps.SupportMapFragment" />
Map fragment activity class
public class StadiumsMapsFragmentActivity extends FragmentActivity {
private MapsFragmentLegacy mMapFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapactivity);
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
try {
if(mMapFragment == null) {
if (MyWrapper.hasHere(context)) {
mMapFragment = new MapsFragmentHere();
} else {
mMapFragment = new MapsFragmentGoogle();
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().add(R.id.map_container, mMapFragment).commit();
}
}
catch(Exception e){
if(DEBUG)e.printStackTrace();
}
}
}
MapsFragmentHere class
import com.nokia.android.gms.maps.CameraUpdateFactory;
import com.nokia.android.gms.maps.GoogleMap;
import com.nokia.android.gms.maps.SupportMapFragment;
import com.nokia.android.gms.maps.model.BitmapDescriptorFactory;
import com.nokia.android.gms.maps.model.LatLng;
import com.nokia.android.gms.maps.model.MarkerOptions;
import com.nokia.android.gms.maps.model.PolylineOptions;
public class MapsFragmentHere extends MapsFragmentLegacy {
private GoogleMap mMap;
private LatLng mLatLng;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
FRAGMENT_LAYOUT = R.layout.hmaps;
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SupportMapFragment mapFragment = (SupportMapFragment) getFragmentManager().findFragmentById(FRAGMENT_ID);
mMap = mapFragment.getMap();
setUpMap();
}
private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
LatLng origin = new LatLng(location.getLatitude(), location.getLongitude());
// Draw direction if needed
}
};
private void setUpMap() {
if(mMap != null) {
mLatLng = new LatLng(LATITUDE, LONGITUDE);
mMap.setMyLocationEnabled(true);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLatLng, 16));
mMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker))
.title("title")
.snippet("")
.position(mLatLng));
mMap.setOnMyLocationChangeListener(myLocationChangeListener);
}
}
}
MapsFragmentLegacy class
public class MapsFragmentLegacy extends Fragment {
protected static int FRAGMENT_LAYOUT = R.layout.maps;
protected static final int FRAGMENT_ID = R.id.map;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(FRAGMENT_LAYOUT, container, false);
}
}
Map is displayed correctly with camera position, initial zoom, working zoom controls and custom marker. Any help will be appreciated :)