这是一个标题
AndroidManifest 声明权限
//地图SDK(包含其搜索功能)需要的基础权限 <!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许程序访问WiFi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许程序读写手机状态和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
设置高德Key
<meta-data android:name="com.amap.api.v2.apikey" android:value="key">//开发者申请的key </meta-data>
XML布局
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
在Android Studio环境下:
步骤1:
添加so文件,在src/main/目录下新建jniLibs目录,并将文件放入其中。
使用默认配置,不需要修改build.gradle。在 main 目录下创建文件夹 jniLibs (如果有就不需要创建了),将下载文件的 armeabi 文件夹复制到这个目录下,如果已经有这个目录,将下载的 so 库复制到这个目录即可。
代码实现:
public class Main2Activity extends AppCompatActivity implements RouteSearch.OnRouteSearchListener, AMap.OnMyLocationChangeListener, GeocodeSearch.OnGeocodeSearchListener { private MapView mapView; private AMap aMap; private double latitude; private double longitude; private RouteSearch routeSearch; private LatLonPoint latLonPoint; private String mudidi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); //定义了一个地图view mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState);// 此方法须覆写,虚拟机需要在很多情况下保存地图绘制的当前状态。 //初始化地图控制器对象 if (aMap == null) { aMap = mapView.getMap(); } Intent intent = getIntent(); mudidi = intent.getStringExtra("a"); initbluedian(); }
//坐标转换 private void zuobiaohuhuan() { GeocodeSearch geocoderSearch; //地理编码搜索GeocodeSearch geocoderSearch = new GeocodeSearch(this); geocoderSearch.setOnGeocodeSearchListener(this); // name表示地址,第二个参数表示查询城市,中文或者中文全拼,citycode、adcode GeocodeQuery query = new GeocodeQuery(mudidi, ""); geocoderSearch.getFromLocationNameAsyn(query); }
private void initluxian() { routeSearch = new RouteSearch(this); routeSearch.setRouteSearchListener(this); // fromAndTo包含路径规划的起点和终点,drivingMode表示驾车模式 // 第三个参数表示途经点(最多支持16个),第四个参数表示避让区域(最多支持32个),第五个参数表示避让道路 Log.d("Main2Activity", "latitude:" + latitude); Log.d("Main2Activity", "latitude:" + longitude); Log.d("Main2Activity", "latitude:" + latLonPoint); RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(new LatLonPoint(latitude,longitude),latLonPoint); RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, RouteSearch.BUS_DEFAULT, null, null, ""); routeSearch.calculateDriveRouteAsyn(query); } //设置定位蓝点 private void initbluedian() { MyLocationStyle myLocationStyle; myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。 // myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。 myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);//只定位一次。 aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style myLocationStyle.showMyLocation(true);//设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。 aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示,非必需设置。 aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。 //设置SDK 自带定位消息监听 aMap.setOnMyLocationChangeListener(this); }
//获取我的位置 @Override public void onMyLocationChange(Location location) { //维度 latitude = location.getLatitude(); //经度 longitude = location.getLongitude(); zuobiaohuhuan(); }
@Override public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) { } //获取终点位置 @Override public void onGeocodeSearched(GeocodeResult geocodeResult, int i) { latLonPoint = geocodeResult.getGeocodeAddressList().get(0).getLatLonPoint(); initluxian(); }
@Override public void onDriveRouteSearched(DriveRouteResult result, int errorCode) { aMap.clear();// 清理地图上的所有覆盖物 if (errorCode == AMapException.CODE_AMAP_SUCCESS) { if (result != null && result.getPaths() != null) { if (result.getPaths().size() > 0) { final DrivePath drivePath = result.getPaths() .get(0); if (drivePath == null) { return; } DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay( Main2Activity.this, aMap, drivePath, result.getStartPos(), result.getTargetPos(), null); drivingRouteOverlay.setNodeIconVisibility(false);//设置节点marker是否显示 drivingRouteOverlay.setIsColorfulline(true);//是否用颜色展示交通拥堵情况,默认true drivingRouteOverlay.removeFromMap(); drivingRouteOverlay.addToMap(); drivingRouteOverlay.zoomToSpan(); // mBottomLayout.setVisibility(View.VISIBLE); // int dis = (int) drivePath.getDistance(); // int dur = (int) drivePath.getDuration(); // String des = AMapUtil.getFriendlyTime(dur)+"("+AMapUtil.getFriendlyLength(dis)+")"; // mRotueTimeDes.setText(des); // mRouteDetailDes.setVisibility(View.VISIBLE); // int taxiCost = (int) mDriveRouteResult.getTaxiCost(); // mRouteDetailDes.setText("打车约"+taxiCost+"元"); // mBottomLayout.setOnClickListener(new OnClickListener() { // @Override // public void onClick(View v) { // Intent intent = new Intent(mContext, // DriveRouteDetailActivity.class); // intent.putExtra("drive_path", drivePath); // intent.putExtra("drive_result", // mDriveRouteResult); // startActivity(intent); // } // }); } else if (result != null && result.getPaths() == null) { ToastUtil.show(Main2Activity.this, R.string.no_result); } } else { ToastUtil.show(Main2Activity.this, R.string.no_result); } } else { ToastUtil.showerror(Main2Activity.this, errorCode); } } @Override public void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) { } @Override public void onRideRouteSearched(RideRouteResult rideRouteResult, int i) { }