【Lession 9 】集成高德地图SDK
访问量: 4125
参考: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(); + }
就可以了!