【Lession 9 】集成高德地图SDK
访问量: 4167
参考:http://lbs.amap.com/api/android-sdk/guide/project/ 说还可以。
这个模块的地址在:
demo: https://github.com/sg552/titanium_demo_app_using_module_gaode_map
module: https://github.com/sg552/titanium_module_gaode_map
关键要看下载的高德SDK中的源代码。 根据源代码来看,是最准确的。
下面是在 native android 上运行的步骤:
经验:
0. 多次引用高德地图so文件的话, app会闪退。
1. 一些so 文件,放在app/libs目录下就可以了。不需要再次放在app/src/main/jniLibs 目录下。如图
▾ app/
▸ build/
▾ libs/
▾ armeabi/
libgdamapv4sdk751.so*
libgdamapv4sdk751ex.so*
AMap_Android_3DMapSDK_V3.1.1_20151216.jar*
AMap_Location_v2.0.0_20151117.jar*
AMap_Services_V2.7.0_20151125.jar*
Volley.jar*
多次引用的话,编译时(gradle assembleDebug) 会报错. (Exception 啥的,忘记了。总之是gradle的错误)
也可以把 app/libs 中的armeabi 文件夹删掉,保留 app/src/main/jniLibs。
然后在app/build.gradle 的配置中,使用下面这段 :
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// 这一行最关键,它可以在编译时找到so文件(如果把armeabi 文件夹放到 app/libs 目录下的话)
compile fileTree(dir: 'libs', include: ['.jar','.so'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile files('libs/AMap_Android_3DMapSDK_V3.1.1_20151216.jar') // 这一行也重要。可以找到高德地图。
}
然后就是:
增加对应的XML:
<com.amap.api.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.amap.api.maps.MapView>
在对应的activity中调用它即可。
+
+ mapView = (MapView)findViewById(R.id.map);
+ mapView.onCreate(savedInstanceState);
+ if(aMap == null) {
+ aMap = mapView.getMap();
+ }
没什么难度。 上面的代码只做提醒,不做严格的参照功能。 具体的请看下载的源代码。
自己写出来的东西,还是有点儿小激动的,附图:

重头戏开始了:
在 Titanium上运行安卓地图的步骤
1. $ ti create module . (具体步骤略)
会创建一系列的文件夹和两个文件:
ExampleProxy 是用来调用View的, ModuleGaodemapModule 则是一个入口,供app.js 中 require 这个module
▾ android/
▸ assets/
▸ build/
▸ dist/
▸ example/
▸ lib/
▸ libs/
▸ platform/
▾ src/
▾ com/
▾ test/
▾ gaode/
ExampleProxy.java
ModuleGaodemapModule.java
build.properties
build.xml
manifest
2. Module 不用去碰。
3. 只修改proxy就可以了。 因为高德地图的精髓,就几个地方:
3.1 XML 配置 (见上面), 注意把代码要写到 tiapp.xml 中,而不是写到module的timodule.xml中。系统会读取不到。提示 INVALID_USER_SCODE 或者 INVALID_USER_KEY, 例如:
<android>
<manifest>
<application>
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="525d3af330ff5e9abf60d8b931263d12"/>
....
3.2 在activity 中调用。 (上面代码)
在XML中,例子中的配置是两处: 1. 配置key , 2. 配置XML,生成一个MapView. 我们则不需要这样。
例子中:
我们则:
public ExampleView(TiViewProxy proxy) {
super(proxy);
//layoutParams for holder view
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
//holder view
LinearLayout holder = new LinearLayout(proxy.getActivity());
holder.setLayoutParams(lp);
map_view = new MapView(proxy.getActivity());
text = new TextView(proxy.getActivity());
holder.addView(map_view);
holder.addView(text);
setNativeView(holder);
}
@Override
public TiUIView createView(Activity activity)
{
TiUIView view = new ExampleView(this);
view.getLayoutParams().autoFillsHeight = true;
view.getLayoutParams().autoFillsWidth = true;
Log.i(LCAT, "== in createView, in proxy");
text.setText("lalalalalala");
if(a_map == null){
Log.i(LCAT, "a_map is null");
a_map = map_view.getMap();
}
Log.i(LCAT, "a_map: " + a_map.toString());
return view;
}
@Override
public void onCreate(Activity activity, Bundle savedInstanceState) {
map_view.onCreate(savedInstanceState);
Log.i(LCAT, "====== after map_view.onCreate");
}
// 注意!!!! 其他的 onPause , onDestroy等方法必须要有! 否则地图显示不出来!
// 调试时,最好使用 正式打包的apk, 否则sha1 对不上的话,地图也出不来,出现 INVALID_USER_SCODE 错误。
+ /**
+ * 方法必须重写
+ */
+ @Override
+ public void onResume(Activity activity) {
+ super.onResume(activity);
+ map_view.onResume();
+ }
+
+ /**
+ * 方法必须重写
+ */
+ @Override
+ public void onPause(Activity activity) {
+ super.onPause(activity);
+ map_view.onPause();
+ }
+
+ /**
+ * 方法必须重写
+ */
+ //@Override
+ //public void onSaveInstanceState(Bundle outState) {
+ // super.onSaveInstanceState(outState);
+ // map_view.onSaveInstanceState(outState);
+ //}
+
+ /**
+ * 方法必须重写
+ */
+ @Override
+ public void onDestroy(Activity activity) {
+ super.onDestroy(activity);
+ map_view.onDestroy();
+ }
就可以了!