Back

【Lession 9 】集成高德地图SDK

发布时间: 2016-01-06 10:46:00

参考: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();
+  }

就可以了!

Back