关于Android高德地图的简单开发
来源:互联网 发布:阿里云被攻击拿数据 编辑:程序博客网 时间:2024/05/09 11:53
最近公司有用到高德地图,初次涉及地图相关东东。。当时一脸懵逼。。。
高德地图使用其实不算难 搞懂规则 根据API来搞 很容易上手。。
多的不说了 直接上干货。。
以下为初次接触时 ,练手的DEMO
import android.app.Activity;import android.app.ProgressDialog;import android.content.ContentValues;import android.graphics.Color;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.Editable;import android.text.TextWatcher;import android.util.Log;import android.view.Gravity;import android.view.KeyEvent;import android.view.View;import android.widget.AdapterView;import android.widget.AutoCompleteTextView;import android.widget.Button;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;import android.widget.Toast;import com.amap.api.location.AMapLocation;import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.AMapLocationListener;import com.amap.api.maps.AMap;import com.amap.api.maps.CameraUpdateFactory;import com.amap.api.maps.LocationSource;import com.amap.api.maps.MapView;import com.amap.api.maps.UiSettings;import com.amap.api.maps.model.BitmapDescriptorFactory;import com.amap.api.maps.model.LatLng;import com.amap.api.maps.model.Marker;import com.amap.api.maps.model.MarkerOptions;import com.amap.api.maps.model.Poi;import com.amap.api.maps.overlay.PoiOverlay;import com.amap.api.services.core.LatLonPoint;import com.amap.api.services.core.PoiItem;import com.amap.api.services.core.SuggestionCity;import com.amap.api.services.geocoder.GeocodeQuery;import com.amap.api.services.geocoder.GeocodeResult;import com.amap.api.services.geocoder.GeocodeSearch;import com.amap.api.services.geocoder.RegeocodeQuery;import com.amap.api.services.geocoder.RegeocodeResult;import com.amap.api.services.help.Inputtips;import com.amap.api.services.help.InputtipsQuery;import com.amap.api.services.help.Tip;import com.amap.api.services.poisearch.PoiResult;import com.amap.api.services.poisearch.PoiSearch;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Objects;public class MapActivity extends Activity implements View.OnClickListener,LocationSource,AMapLocationListener,TextWatcher,Inputtips.InputtipsListener,AMap.OnMarkerClickListener,PoiSearch.OnPoiSearchListener,AMap.OnPOIClickListener,GeocodeSearch.OnGeocodeSearchListener{ private MapView mapView; private AMap aMap; private LinearLayout ly_1; private Button bt_map; private AutoCompleteTextView search_keyword; //输入要搜索的keyword private ListView listview; //keyword 监听数据形成的列表 private ProgressDialog progDialog = null;// 进度条显示 private LinearLayout ly_2; //ly_1 所包含的布局之一 private Button bt_back1; private ListView history_listview; private TextView history_item_tv; List<Map<String, Object>> listItem; //输入keyword,数据返回的list数据源 //====================以下为操作数据库================== private ArrayList<HashMap<String, Object>> MapHistoryList; //=============地图定位控件============== private OnLocationChangedListener mListener; private AMapLocationClient mlocationClient; private AMapLocationClientOption mLocationOption; //=============地图自身UI定义============ private UiSettings mUiSettings; //=============通用地图控件============== private LatLonPoint mLatLonPoint;//初始定位经纬度 private double ms,me; //经纬度double值 private String locationAdressName; //=============地图POI关键字搜索========== private PoiResult poiResult; // poi返回的结果 private PoiSearch.Query query;// Poi查询条件类 private PoiSearch poiSearch;// POI搜索 private static String keyWord = "";// 要输入的poi搜索关键字 private int currentPage = 0;// 当前页面,从0开始计数 private Button bt_search; //搜索POI private MarkerOptions options; //========================以下为地理编码================= private GeocodeSearch geocoderSearch; private static String addressCityDistric; //得到逆地理编码的 市区 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.base_map_activity); mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState);// 此方法必须重写 init(); initUi(); initHistoryList(); } /** * 初始化AMap对象 */ private void init() { if (aMap == null) { aMap = mapView.getMap(); setUpMap(); } } /** * 设置一些amap的属性 */ private void setUpMap() { aMap.setLocationSource(this);// 设置定位监听 aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示 aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false // 设置定位的类型为定位模式 ,可以由定位、跟随或地图根据面向方向旋转几种 aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE); mUiSettings= aMap.getUiSettings(); //实例化地图UI设置 mUiSettings.setScaleControlsEnabled(true); //比例尺显示 mUiSettings.setCompassEnabled(false); //指南针不显示 mLocationOption.setGpsFirst(true); //优先返回GPS定位信息 aMap.setOnPOIClickListener(this); //POI 点击事件监听 aMap.setOnMarkerClickListener(this); geocoderSearch = new GeocodeSearch(this); geocoderSearch.setOnGeocodeSearchListener(this); // 注册地理编码监听 } private void initUi(){ ly_1=(LinearLayout)findViewById(R.id.map_2); //地图隐藏掉显示的界面 bt_map=(Button)findViewById(R.id.map_bt); //首页 按钮 bt_map.setOnClickListener(this); //返回键 bt_back1=(Button)findViewById(R.id.bt_back_1); bt_back1.setOnClickListener(this); //keyword search_keyword=(AutoCompleteTextView)findViewById(R.id.keyWord); search_keyword.addTextChangedListener(this); //keyword输入list listview=(ListView)findViewById(R.id.map_list); //第二页显示 ly_2=(LinearLayout)findViewById(R.id.history_record); //POI 搜索 按钮 bt_search=(Button)findViewById(R.id.bt_search); bt_search.setOnClickListener(this); //历史记录 list history_listview=(ListView)findViewById(R.id.lv_history); history_item_tv=(TextView)findViewById(R.id.history_item_addressName); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.map_bt: bt_map.setVisibility(View.GONE); mapView.setVisibility(View.GONE); ly_1.setVisibility(View.VISIBLE); break; case R.id.bt_search: // mlocationClient.stopLocation(); searchButton(); bt_map.setVisibility(View.GONE); mapView.setVisibility(View.VISIBLE); ly_1.setVisibility(View.VISIBLE); listview.setVisibility(View.GONE); ly_2.setVisibility(View.GONE); break; case R.id.bt_back_1: aMap.clear(); bt_map.setVisibility(View.VISIBLE); mapView.setVisibility(View.VISIBLE); ly_1.setVisibility(View.GONE); break; } } /** * 方法必须重写 */ @Override protected void onResume() { super.onResume(); mapView.onResume(); } /** * 方法必须重写 */ @Override protected void onPause() { super.onPause(); mapView.onPause(); } /** * 方法必须重写 */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } /** * 方法必须重写 */ @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); } /** * back设置 * @param keyCode * @param event * @return */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK ) { aMap.clear(); bt_map.setVisibility(View.VISIBLE); mapView.setVisibility(View.VISIBLE); ly_1.setVisibility(View.GONE); } return false; } //========================================================以下为定位=============================================== /** * 激活定位 */ @Override public void activate(OnLocationChangedListener listener) { mListener = listener; if (mlocationClient == null) { mlocationClient = new AMapLocationClient(this); mLocationOption = new AMapLocationClientOption(); //设置定位监听 mlocationClient.setLocationListener(this); //设置为高精度定位模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //设置定位参数 mlocationClient.setLocationOption(mLocationOption); // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗, // 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求 // 在定位结束后,在合适的生命周期调用onDestroy()方法 // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除 mlocationClient.startLocation(); } } /** * 停止定位 */ @Override public void deactivate() { mListener = null; if (mlocationClient != null) { mlocationClient.stopLocation(); mlocationClient.onDestroy(); } mlocationClient = null; } LatLng latLng=null; /** * 定位成功后回调函数ms,me; */ @Override public void onLocationChanged(AMapLocation amapLocation) { if (mListener != null && amapLocation != null) { if (amapLocation != null && amapLocation.getErrorCode() == 0) { mListener.onLocationChanged(amapLocation);// 显示系统小蓝点 latLng = new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude()); //当前定位后的详细位置(省、市、区、街道信息) ms=amapLocation.getLatitude(); me=amapLocation.getLongitude(); aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,14)); locationAdressName=amapLocation.getProvider()+amapLocation.getCity()+amapLocation.getDistrict()+amapLocation.getAddress(); } else { String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo(); Toast.makeText(getApplicationContext(),errText,Toast.LENGTH_SHORT).show(); } } }//=========================================以下为keyword 改变监听=================================== @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence s, int start, int stop, int count) { String newText = s.toString().trim(); //在这里判断 是否有输入 if(s.length()<1){ ly_2.setVisibility(View.VISIBLE); listview.setVisibility(View.GONE); }else { ly_2.setVisibility(View.GONE); mapView.setVisibility(View.GONE); listview.setVisibility(View.VISIBLE); } if (!AMapUtil.IsEmptyOrNullString(newText)) { InputtipsQuery inputquery = new InputtipsQuery(newText, Utils.city); Inputtips inputTips = new Inputtips(BaseMapActivity.this, inputquery); inputTips.setInputtipsListener(this); //设置=======得到数据监听======= inputTips.requestInputtipsAsyn(); } } @Override public void afterTextChanged(Editable editable) { } //=======得到数据监听======= @Override public void onGetInputtips(List<Tip> tipList, int rCode) { if (rCode == 1000) {// 正确返回 //监听反馈回来的数据当做listView数据源 listItem=new ArrayList<Map<String,Object>>(); for (int i = 0; i < tipList.size(); i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("mapName",tipList.get(i).getName()); map.put("mapAddress",tipList.get(i).getDistrict()); map.put("mapPosition",tipList.get(i).getPoint()); listItem.add(map); } listview.setAdapter(new MapListAdapter(this,listItem)); //输入时keyword 产生的列表的 item点击事件 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { aMap.clear(); mlocationClient.stopLocation(); LatLonPoint latLonPoint=(LatLonPoint)(listItem.get(i).get("mapPosition")); Double dd=latLonPoint.getLatitude(); Double ee=latLonPoint.getLongitude(); options=new MarkerOptions(); Marker marker=aMap.addMarker(options.position(new LatLng(dd,ee))); //做marker标记 marker.setVisible(true); aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dd,ee), 14));//移动视图 bt_map.setVisibility(View.GONE); mapView.setVisibility(View.VISIBLE); ly_1.setVisibility(View.VISIBLE); listview.setVisibility(View.GONE); ly_2.setVisibility(View.GONE); Toast.makeText(getApplicationContext(),""+listItem.get(i).get("mapPosition"),Toast.LENGTH_SHORT).show(); } }); } else { ToastUtil.showerror(this, rCode); } } //==========================================以下为POI关键字搜索===================================================== /** * 显示进度框 */ private void showProgressDialog() { if (progDialog == null) progDialog = new ProgressDialog(this); progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progDialog.setIndeterminate(false); progDialog.setCancelable(false); progDialog.setMessage("正在搜索:\n" + keyWord); progDialog.show(); } /** * 隐藏进度框 */ private void dissmissProgressDialog() { if (progDialog != null) { progDialog.dismiss(); } } /** * 点击搜索按钮 */ public void searchButton() { keyWord = AMapUtil.checkEditText(search_keyword); if ("".equals(keyWord)) { ToastUtil.show(MapActivity.this, "请输入搜索关键字"); return; } else { doSearchQuery(); if (MapHistoryList.size()>0){ for (int i=0;i<MapHistoryList.size();i++){ if (keyWord.equals(MapHistoryList.get(i).get("mapHistoryName").toString())){ return; } }} } } /** * 开始进行poi搜索 */ protected void doSearchQuery() { showProgressDialog();// 显示进度框 mlocationClient.stopLocation(); //停止定位 20160812 query = new PoiSearch.Query(keyWord, "", Utils.city);// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国) query.setPageSize(20);// 设置每页最多返回多少条poiitem query.setPageNum(currentPage);// 设置查第一页 poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener(this); poiSearch.searchPOIAsyn(); } /** * poi没有搜索到数据,返回一些推荐城市的信息 */ private void showSuggestCity(List<SuggestionCity> cities) { String infomation = "推荐城市\n"; for (int i = 0; i < cities.size(); i++) { infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:" + cities.get(i).getCityCode() + "城市编码:" + cities.get(i).getAdCode() + "\n"; } ToastUtil.show(MapActivity.this, infomation); } /** * POI信息查询回调方法 */ @Override public void onPoiSearched(PoiResult result, int rCode) { dissmissProgressDialog();// 隐藏对话框 if (rCode == 1000) { if (result != null && result.getQuery() != null) {// 搜索poi的结果 if (result.getQuery().equals(query)) {// 是否是同一条 poiResult = result; // 取得搜索到的poiitems有多少页 List<PoiItem> poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始 List<SuggestionCity> suggestionCities = poiResult .getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息 if (poiItems != null && poiItems.size() > 0) { aMap.clear();// 清理之前的图标 PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems); poiOverlay.removeFromMap(); poiOverlay.addToMap(); poiOverlay.zoomToSpan(); } else if (suggestionCities != null && suggestionCities.size() > 0) { showSuggestCity(suggestionCities); } else { ToastUtil.show(MapActivity.this, "无返回结果"); } } } else { ToastUtil.show(MapActivity.this, "无返回结果"); } } else { ToastUtil.showerror(this, rCode); } } @Override public void onPoiItemSearched(PoiItem poiItem, int i) { }//===================以下为POI 点击事件================ @Override public void onPOIClick(Poi poi) { // aMap.clear(); //暂时去掉 MarkerOptions markOptiopns = new MarkerOptions(); markOptiopns.position(poi.getCoordinate()); TextView textView = new TextView(getApplicationContext()); textView.setText("到"+poi.getName()+"去"); textView.setGravity(Gravity.CENTER); textView.setTextColor(Color.BLACK); textView.setBackgroundResource(R.drawable.dir1); markOptiopns.icon(BitmapDescriptorFactory.fromView(textView)); markOptiopns.icon(BitmapDescriptorFactory.defaultMarker()); aMap.addMarker(markOptiopns); LatLng newLatLng=poi.getCoordinate(); Double ss=newLatLng.latitude; Double se=newLatLng.longitude; // LatLonPoint newLatLonPoint=new LatLonPoint(ss,se); getAddress(new LatLonPoint(ss,se)); // Toast.makeText(getApplicationContext(),"marker"+addressCityDistric,Toast.LENGTH_SHORT).show(); } //==================以下为 marker 点击事件反馈=================== @Override public boolean onMarkerClick(Marker marker) { Toast.makeText(getApplicationContext(),"marker点击"+marker.getPosition()+"--"+marker.getTitle()+"--"+marker.getSnippet(),Toast.LENGTH_SHORT).show(); marker.getPosition(); return false; }//========================以下为地理编码以及你地理编码================================ /** * 响应地理编码 */ public void getLatlon(final String name) { // showDialog(); GeocodeQuery query = new GeocodeQuery(name, Utils.city);// 第一个参数表示地址,第二个参数表示查询城市,中文或者中文全拼,citycode、adcode, geocoderSearch.getFromLocationNameAsyn(query);// 设置同步地理编码请求 } /** * 响应逆地理编码 */ public void getAddress(final LatLonPoint latLonPoint) { // showDialog(); RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系 geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求 } /** * 地理编码查询回调 */ @Override public void onGeocodeSearched(GeocodeResult result, int rCode) { // dismissDialog(); if (rCode == 1000) { if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) { // GeocodeAddress address = result.getGeocodeAddressList().get(0); // aMap.animateCamera(CameraUpdateFactory.newLatLngZoom( // AMapUtil.convertToLatLng(address.getLatLonPoint()), 15)); // geoMarker.setPosition(AMapUtil.convertToLatLng(address // .getLatLonPoint())); // addressName = "经纬度值:" + address.getLatLonPoint() + "\n位置描述:" // + address.getFormatAddress(); } } else { ToastUtil.showerror(this, rCode); } } /** * 逆地理编码回调 */ @Override public void onRegeocodeSearched(RegeocodeResult result, int rCode) { // dismissDialog(); if (rCode == 1000) { if (result != null && result.getRegeocodeAddress() != null) { addressCityDistric = result.getRegeocodeAddress().getFormatAddress(); TextView tv=(TextView)findViewById(R.id.address_name); tv.setText(addressCityDistric); Log.e("fans",""+addressCityDistric); } else { ToastUtil.showerror(this, rCode); } } }}
</pre><pre>资源文件如下:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.gaodemap.BaseMapActivity"> <Button android:id="@+id/map_bt" android:layout_width="260dp" android:layout_height="40dp" android:text="|查地点、搜路线" android:layout_marginLeft="10dp" android:layout_marginTop="7dp" android:background="@android:color/white" /> <com.amap.api.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" > </com.amap.api.maps.MapView><LinearLayout android:id="@+id/ly_address_route" android:layout_width="350dp" android:layout_height="70dp" android:orientation="vertical" android:layout_centerHorizontal="true" android:layout_marginTop="450dp" android:background="@android:color/darker_gray" > <LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:orientation="horizontal" > <TextView android:id="@+id/address_name" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center"/> <TextView android:id="@+id/xiangqing" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="3" android:text="详情" android:gravity="center" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/black"></FrameLayout> <TextView android:id="@+id/route_tv" android:layout_width="match_parent" android:layout_height="29dp" android:text="路径规划" android:gravity="center"/></LinearLayout> <LinearLayout android:id="@+id/map_2" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:visibility="gone"> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:orientation="horizontal"> <Button android:id="@+id/bt_back_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="返回"/> <AutoCompleteTextView android:id="@+id/keyWord" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="请输入关键字" android:textSize="14dp" android:imeOptions="actionDone" android:inputType="text|textAutoComplete" android:maxLength="20" android:layout_weight="2"/> <Button android:id="@+id/bt_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="搜索"/> </LinearLayout> <ListView android:id="@+id/map_list" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"></ListView> <LinearLayout android:id="@+id/history_record" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@android:color/darker_gray" > <TextView android:id="@+id/history_tv" android:layout_width="match_parent" android:layout_height="50dp" android:text="历史记录" android:textSize="16dp" android:gravity="center" /> <ListView android:id="@+id/lv_history" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp"></ListView> <TextView android:id="@+id/zero_history_tv" android:layout_width="match_parent" android:layout_height="50dp" android:text="清空历史记录" android:textSize="16dp" android:gravity="center" /> </LinearLayout> </LinearLayout></RelativeLayout>
好了,初步的使用就是这样。
清单文件中相关权限
<!--地图相关权限--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- 定位需要的服务 使用2.0的定位需要加上这个 --> <service android:name="com.amap.api.location.APSService" ></service>
申请官方相关key ,根据自己androdi studio 上的sha1值和包名来获取
<meta-data android:name="com.amap.api.v2.apikey" android:value="xxxxxxxxxxxxxxxxxxxxxxx" />
大家有什么不懂的,可以留言给我。一起交流探讨
3 0
- 关于Android高德地图的简单开发
- Android Studio 关于高德地图的开发:显示地图
- android开发一:高德地图的简单制作
- Android 高德地图的开发
- 关于android高德地图地图无法显示的问题
- 开发Android高德地图
- Android高德地图开发 地图事件
- 关于高德地图Android开发时地图只显示一次、第二次打开不定位的解决办法
- 高德地图Android自定义路线规划的简单实现
- 高德地图开发--地图的显示
- Android 高德地图 关于INVALID_USER_KEY和INVALID_USER_SCODE的问题
- 高德地图在android上的开发汇总
- (android地图开发) 高德地图开发准备
- android---高德地图(1)---显示一张简单地图
- Android 使用高德地图简单实现地图定位
- Android Map 开发之高德地图
- Android Map 开发之高德地图
- Android高德地图开发详解
- android中的动画
- 数据库学生管理系统(StudentManagerSystemDB_V1.0)
- matlab代码编写中的Code Cells模式
- 干货 | 人工智能体系大纲图谱(初、中、高级篇)
- android发送模拟按键消息,出现死锁,timeout的解决方法
- 关于Android高德地图的简单开发
- 算法系列—贪心算法
- Resources的使用方式
- 批量上传非结构化数据到HBase
- JPA设置表名和实体名,表字段与实体字段的对应
- 程序员11月书讯
- 相册获取图片细节处理
- html5本地存储和文件上传
- 循环链表