MrAlpha_SU
MrAlpha_SU

Reputation: 331

Unable to use SK maps in Android studio

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

Answers (1)

MrAlpha_SU
MrAlpha_SU

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 mapViewfor null or set a boolean in onSurfaceCreatedmethod 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 onSurfaceCreatedwhich I haven't done and hence caused errors like no annotations were drawn.

Upvotes: 3

Related Questions