Reputation: 331
I am trying to use SK maps SDK for Android, but I am facing some problems. I have followed as guided on this website :http://developer.skobbler.com/getting-started/android for integrating SDK in Android but still I am making mistake somewhere it seems. The problem is: As soon I launch the app, the first activity is correctly starting but as soon as SK maps library is initialised and the Map activity is created, the app crashes without showing any error. Here is my Initialization code:
public class Map_initialization extends AppCompatActivity implements SKMapsInitializationListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
SKMaps.getInstance().initializeSKMaps(getApplication(),this);
}
@Override
public void onLibraryInitialized(boolean b) { ///once maps initialized then go to map activity
Intent intent=new Intent(this,MainActivity.class);
startActivity(intent);
}
}
Here is my Map Activity Code: Here map is created.
public class MainActivity extends AppCompatActivity implements SKMapSurfaceListener {
double lat;
double lng;
float zoom_level=0;
String Location="19.875692,75.353020";
// get the annotation object
SKAnnotation new_loc = new SKAnnotation(10); //marker which can be visible on map
/**
* Surface view for displaying the map
*/
private SKMapSurfaceView mapView;
/**
* the view that holds the map view
*/
SKMapViewHolder mapHolder;
// get the callout view object from the map holder
SKCalloutView mapPopup = mapHolder.getCalloutView();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapHolder = (SKMapViewHolder) findViewById(R.id.map_surface_holder);
}
@Override
protected void onDestroy() {
super.onDestroy();
SKMaps.getInstance().destroySKMaps();
}
public void Show_Location()
{
lat=Double.valueOf(Location.substring(0,9));//extracting latitude
lng=Double.valueOf(Location.substring(10,Location.length()));//extracting longitude
zoom_level=16;
new_loc.setAnnotationType(SKAnnotation.SK_ANNOTATION_TYPE_BLUE);
new_loc.setLocation(new SKCoordinate(lat,lng));
mapView.animateToZoomLevel(zoom_level);
mapView.animateToLocation(new SKCoordinate(lat,lng),1000);
mapView.addAnnotation(new_loc, SKAnimationSettings.ANIMATION_PIN_DROP);//adding marker
// set the callout view’s background color
mapPopup.setViewColor(Color.argb(255, 200, 200, 255));
mapPopup.showAtLocation(new SKCoordinate(lat,lng),true);
}
@Override
protected void onPause() {
super.onPause();
mapHolder.onPause();
}
@Override
protected void onResume() {
super.onResume();
mapHolder.onResume();
}
@Override
public void onActionPan() {
zoom_level--;
mapView.setZoom(zoom_level);
}
@Override
public void onActionZoom() {
zoom_level++;
mapView.setZoom(zoom_level);
}
@Override
public void onSurfaceCreated(SKMapViewHolder skMapViewHolder) { //on map surface created
mapView = mapHolder.getMapSurfaceView();
mapView.getMapSettings().setMapPoiIconsShown(true);
mapView.getMapSettings().setMapPanningEnabled(true);
mapView.getMapSettings().setMapZoomingEnabled(true);
}
@Override
public void onMapRegionChanged(SKCoordinateRegion skCoordinateRegion) {
}
@Override
public void onMapRegionChangeStarted(SKCoordinateRegion skCoordinateRegion) {
}
@Override
public void onMapRegionChangeEnded(SKCoordinateRegion skCoordinateRegion) {
}
@Override
public void onDoubleTap(SKScreenPoint skScreenPoint) {
}
@Override
public void onSingleTap(SKScreenPoint skScreenPoint) {
}
@Override
public void onRotateMap() {
}
@Override
public void onLongPress(SKScreenPoint skScreenPoint) {
}
@Override
public void onInternetConnectionNeeded() {
}
@Override
public void onMapActionDown(SKScreenPoint skScreenPoint) {
}
@Override
public void onMapActionUp(SKScreenPoint skScreenPoint) {
}
@Override
public void onPOIClusterSelected(SKPOICluster skpoiCluster) {
}
@Override
public void onMapPOISelected(SKMapPOI skMapPOI) {
}
@Override
public void onAnnotationSelected(SKAnnotation skAnnotation) {
}
@Override
public void onCustomPOISelected(SKMapCustomPOI skMapCustomPOI) {
}
@Override
public void onCompassSelected() {
}
@Override
public void onCurrentPositionSelected() {
}
@Override
public void onObjectSelected(int i) {
}
@Override
public void onInternationalisationCalled(int i) {
}
@Override
public void onBoundingBoxImageRendered(int i) {
}
@Override
public void onGLInitializationError(String s) {
Toast.makeText(getApplicationContext(),"ERROR:"+s,Toast.LENGTH_LONG).show();
}
@Override
public void onScreenshotReady(Bitmap bitmap) {
}
}
Here is my gradle for app:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
}
}
//apply plugin: 'java'
repositories {
maven {
url "http://developer.skobbler.com/maven/"
}
}
configurations {
skobblersdk
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "24.0.0"
defaultConfig {
applicationId "com.example.ahirrao.gps"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
signingConfig signingConfigs.config
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
skobblersdk "com.skobbler.ngx:SKMaps:3.0.0"
compile files('libs/SKMaps.jar')
}
def assetsPath = "$projectDir/src/main/assets"
def libsPath = "$projectDir/libs"
def jniLibsPath = "$projectDir/src/main/jniLibs"
task installSKMaps << {
copy {
from configurations.skobblersdk
into "$buildDir/skobblersdk-down"
rename { String fileName -> 'skobblersdkres.zip' }
}
copy {
from zipTree("$buildDir/skobblersdk-down/skobblersdkres.zip")
into "$buildDir/skobblersdk-down"
}
delete("$jniLibsPath",
"$assetsPath/SKMaps.zip",
"$libsPath/SKMaps.jar")
copy {
from "${buildDir}/skobblersdk-down/jniLibs"
into "$jniLibsPath"
}
copy {
from "${buildDir}/skobblersdk-down/"
into "$assetsPath"
}
copy {
from "${buildDir}/skobblersdk-down/SKMaps.jar"
into "$libsPath"
}
delete("$buildDir/skobblersdk-down")
delete(configurations.skobblersdk)
}
This is my Layout for map:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.skobbler.ngx.map.SKMapViewHolder
android:id="@+id/map_surface_holder"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
And on the above website of Skobbler, they have given the code by using JAVA plugin in gradle but I am not able to use it as it is not compatible with android plugin.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ahirrao.gps, PID: 541
java.lang.RuntimeException: Unable to instantiate activity
ComponentInfo{com.example.ahirrao.gps/com.example.ahirrao.gps.MainActivity}:
java.lang.NullPointerException at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2264)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.example.ahirrao.gps.MainActivity.<init>(MainActivity.java:53)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1215)
at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
at dalvik.system.NativeStart.main(Native Method)
Upvotes: 2
Views: 573
Reputation: 331
I figured the error. I was making mistake. Maybe it will help somebody.
I was calling all visual elements before map Surface is created, this caused errors like Null pointer exceptions and cashed the app.So the procedure is to test mapView
for null or set a boolean in onSurfaceCreated
method and test for whether map view is created or not, then draw annotations,etc on map.Also in onCreate
we have to set MapSurface listener on calling onSurfaceCreated
which I haven't done and hence caused errors like no annotations were drawn.
Upvotes: 3