2016-08-14 82 views
2

我正在尝试使用适用于Android的SK地图SDK,但我遇到了一些问题。我遵循本网站的指导:http://developer.skobbler.com/getting-started/android用于在Android中集成SDK,但我仍然在某个地方出现错误。问题是:尽快启动应用程序,第一个活动正确启动,但一旦SK地图库初始化并创建Map活动,应用程序崩溃而不显示任何错误。 这里是我的初始化代码:无法在Android工作室中使用SK地图

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

这是我的地图活动代码:这里创建的地图。

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) { 

} 
} 

这里是我的应用程序的gradle产出:

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) 
} 

这是我在地图布局:

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

而且Skobbler上述网站上,他们已经通过给予代码gradle中的JAVA插件,但我无法使用它,因为它与android插件不兼容。

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)  
+0

还没有回答?也许@Ando会给出很好的答案,因为他在skmaps方面帮助了很多人。 –

+0

在skobbler网站上您可以找到适用于Android Studio的演示项目 - 您确定您没有任何错误日志?例如,您在哪里设置API密钥? – Ando

+0

@Ando嗨,我有演示项目,我成功地运行它。我正在使用METADATA标签设置清单中的API密钥。那么gradle文件呢?我相信问题在于,因为在网站上它被称为使用java插件,但我无法使用它,因此地图可能没有正确安装。我怎样才能使用java插件?关于错误,我会发布logcat。 –

回答

2

我想出了错误。我错了。也许它会帮助别人。

我打电话所有可视元素创建地图表面之前,这引起像空指针的异常的错误和兑现app.So的程序是测试mapView为空值或设定是否地图视图中onSurfaceCreated方法的布尔值和测试然后在地图上绘制注释等。另外在onCreate中,我们必须设置MapSurface监听器,调用onSurfaceCreated,这是我没有做过的,因此导致错误,如未绘制注释。