1、效果图
2、Poi数据搜索
2.1、EditText的输入监听和ListView控件(自行初始化即可)
/**
* EditText输入框监听事件
*/
private void searchAddressListener() {
searchAddress.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (!TextUtils.isEmpty(charSequence)) {
//第二个参数传入null或者“”代表在全国进行检索,否则按照传入的city进行检索
InputtipsQuery inputquery = new InputtipsQuery(String.valueOf(charSequence), cityName);
//限制在当前城市
inputquery.setCityLimit(true);
//构造 Inputtips 对象,并设置监听。
Inputtips inputTips = new Inputtips(MainActivity.this, inputquery);
//回调结果集
inputTips.setInputtipsListener(new Inputtips.InputtipsListener() {
@Override
public void onGetInputtips(final List<Tip> list, int i) {
//1000为成功
if (i == 1000) {
listview.setVisibility(View.VISIBLE);
TipAdapter adapter = new TipAdapter(MainActivity.this, list);
listview.setAdapter(adapter);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
//当前位置的纬度、经度与选中地点的经度纬度
MapNaviActivity.startActivity(MainActivity.this, latitude, longitude,
list.get(position).getPoint().getLatitude(),
list.get(position).getPoint().getLongitude());
Log.e(TAG, "onItemClick: 地点"+ list.get(position).getDistrict());
}
});
} else {
Log.e(TAG, "onGetInputtips: 暂无搜索结果");
}
}
});
//调用 PoiSearch 的 requestInputtipsAsyn() 方法发送请求
inputTips.requestInputtipsAsyn();
} else {
listview.setVisibility(View.GONE);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
2.2、TipAdapter - CommonAdapter链接:http://blog.csdn.net/qq_34536167/article/details/79327007
public class TipAdapter extends CommonAdapter<Tip> {
public TipAdapter(Context context, List<Tip> mDatas) {
super(context, R.layout.list_tip_item, mDatas);
}
@Override
public void convert(ViewHolder holder, Tip item, int postion) {
//名称
String name = item.getName();
holder.setText(R.id.tip_item_name, TextUtils.isEmpty(name) ? "" : name);
//地址
String address = item.getAddress();
holder.setText(R.id.tip_item_address, TextUtils.isEmpty(address) ? "" : address);
}
}
2.3、list_tip_item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:padding="10dp"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tip_item_name"/>
<TextView
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tip_item_address"/>
</LinearLayout>
2.4、activity_main布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/search_address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入地名" />
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#666"
android:dividerHeight="1dp"
android:visibility="gone" />
</LinearLayout>
3、导航界面
3.1、MapNaviActivity
public class MapNaviActivity extends AppCompatActivity implements AMapNaviListener, AMapNaviViewListener {
//导航View
private AMapNaviView aMapNaviView;
private AMapNavi mAMapNavi;
private static final String TAG = "MapNaviActivity";
//起、终点list
private List<NaviLatLng> mStartList;
private List<NaviLatLng> mEndList;
//出发与结束的经纬度
public static void startActivity(Context context, double startlatitude, double startlongitude,
double endlatitude, double endlongitude) {
Intent intent = new Intent(context, MapNaviActivity.class);
intent.putExtra(Constans.LATITUDE, startlatitude);
intent.putExtra(Constans.LONGITUDE, startlongitude);
intent.putExtra(Constans.ENDLATITUDE, endlatitude);
intent.putExtra(Constans.ENDLONGITUDE, endlongitude);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_navi);
aMapNaviView = (AMapNaviView) this.findViewById(R.id.aMapNaviView);
aMapNaviView.onCreate(savedInstanceState);
initView();
}
/**
* 初始化导航配置
*/
private void initView() {
//开始导航监听
aMapNaviView.setAMapNaviViewListener(this);
//获取AMapNavi实例
mAMapNavi = AMapNavi.getInstance(getApplicationContext());
//添加监听回调,用于处理算路成功
mAMapNavi.addAMapNaviListener(this);
//设置模拟导航的行车速度(可坐在 onCalculateRouteSuccess方法中进行测试)
//设置超过120,返回的速度为60
mAMapNavi.setEmulatorNaviSpeed(120);
//设置导航的起始点经纬度
addLocation();
}
private void addLocation() {
if (mStartList == null) {
mStartList = new ArrayList<>();
}
if (mEndList == null) {
mEndList = new ArrayList<>();
}
//起点纬度
double startlatitude = getIntent().getDoubleExtra(Constans.LATITUDE, 0);
//起点经度
double startlongitude = getIntent().getDoubleExtra(Constans.LONGITUDE, 0);
//终点纬度
double endlatitude = getIntent().getDoubleExtra(Constans.ENDLATITUDE, 0);
//终点经度
double endlongitude = getIntent().getDoubleExtra(Constans.ENDLONGITUDE, 0);
//起点、终点、多路径(null),基本参数
NaviLatLng startLatLng = new NaviLatLng(startlatitude, startlongitude);
NaviLatLng endLatLng = new NaviLatLng(endlatitude, endlongitude);
mStartList.add(startLatLng);
mEndList.add(endLatLng);
}
@Override
protected void onResume() {
super.onResume();
if (aMapNaviView != null) {
aMapNaviView.onResume();
}
}
@Override
protected void onPause() {
super.onPause();
if (aMapNaviView != null) {
aMapNaviView.onPause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (aMapNaviView != null) {
aMapNaviView.onDestroy();
//since 1.6.0 不再在naviview destroy的时候自动执行AMapNavi.stopNavi();请自行执行
mAMapNavi.stopNavi();
mAMapNavi.destroy();
}
}
/**
* AMapNaviListener方法
*/
@Override
public void onInitNaviFailure() {
showToast("初始化导航失败");
Log.e(TAG, "初始化导航失败");
}
@Override
public void onInitNaviSuccess() {
showToast("初始化导航成功");
Log.e(TAG, "初始化导航成功");
/**
* @congestion 躲避拥堵
* @avoidhightspeed 不走高速
* @cost 避免收费
* @hightspeed 高速优先
* @multipleroute 多路径 最后一个参数为true时代表多路径,否则代表单路径
*
* 说明: 以上参数都是boolean类型,其中multipleroute参数表示是否多条路线,如果为true则此策略会算出多条路线。
* 注意: 不走高速与高速优先不能同时为true 高速优先与避免收费不能同时为true
*/
// int strategy = 0;
try {
//躲避拥堵、不走高速、避免收费、高速优先、是否为多路径
int strategy = mAMapNavi.strategyConvert(true, false, false, false, false);
mAMapNavi.calculateDriveRoute(mStartList, mEndList, null, strategy);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onStartNavi(int i) {
Log.e(TAG, "开始导航");
}
@Override
public void onTrafficStatusUpdate() {
}
@Override
public void onLocationChange(AMapNaviLocation aMapNaviLocation) {
Log.e(TAG, "当前实时位置的经度" + aMapNaviLocation.getCoord().getLongitude());
Log.e(TAG, "当前实时位置的纬度" + aMapNaviLocation.getCoord().getLatitude());
}
@Override
public void onGetNavigationText(int i, String s) {
//i=1返回成功 (可自行添加语音播报)
Log.e(TAG, "播报类型和播报文字回调: " + i + "\n" + s);
}
@Override
public void onGetNavigationText(String s) {
//播报类型和播报文字回调(旧方法) 会执行但S不会有返回
}
@Override
public void onEndEmulatorNavi() {
Log.e(TAG, "结束模拟导航: ");
}
@Override
public void onArriveDestination() {
Log.e(TAG, "到达目的地,本次导航结束");
}
@Override
public void onCalculateRouteFailure(int i) {
Log.e(TAG, "很抱歉,路线计算失败");
}
@Override
public void onReCalculateRouteForYaw() {
Log.e(TAG, "偏航后重新计算路线回调: ");
}
@Override
public void onReCalculateRouteForTrafficJam() {
Log.e(TAG, "拥堵后重新计算路线回调: ");
}
@Override
public void onArrivedWayPoint(int i) {
}
@Override
public void onGpsOpenStatus(boolean b) {
Log.e(TAG, "GPS开启的状态: "+b);
if (b) {
showToast("GPS已开启");
} else {
showToast("GPS未开启");
}
}
@Override
public void onNaviInfoUpdate(NaviInfo naviInfo) {
Log.e(TAG, "当前行驶的速度:" + naviInfo.getCurrentSpeed());
Log.e(TAG, "当前行驶的道路:" + naviInfo.getCurrentRoadName());
}
@Override
public void onNaviInfoUpdated(AMapNaviInfo aMapNaviInfo) {
}
@Override
public void updateCameraInfo(AMapNaviCameraInfo[] aMapNaviCameraInfos) {
}
@Override
public void onServiceAreaUpdate(AMapServiceAreaInfo[] aMapServiceAreaInfos) {
}
@Override
public void showCross(AMapNaviCross aMapNaviCross) {
}
@Override
public void hideCross() {
}
@Override
public void showModeCross(AMapModelCross aMapModelCross) {
}
@Override
public void hideModeCross() {
}
@Override
public void showLaneInfo(AMapLaneInfo[] aMapLaneInfos, byte[] bytes, byte[] bytes1) {
}
@Override
public void hideLaneInfo() {
}
@Override
public void onCalculateRouteSuccess(int[] ints) {
Log.e(TAG, "路线计算成功: ");
//GPS 模式 1 EMULATOR 模拟导航 2
mAMapNavi.startNavi(NaviType.EMULATOR);
//mAMapNavi.startNavi(NaviType.GPS);
}
@Override
public void notifyParallelRoad(int i) {
if (i == 0) {
showToast("当前在主辅路过渡");
return;
}
if (i == 1) {
showToast("当前在主路");
return;
}
if (i == 2) {
showToast("当前在辅路");
}
}
@Override
public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {
}
@Override
public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {
}
@Override
public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {
}
@Override
public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {
}
@Override
public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {
}
@Override
public void onPlayRing(int i) {
}
/****************************************************************AMapNaviViewListener 方法 底部导航View监听*/
@Override
public void onNaviSetting() {
Log.e(TAG, "底部导航设置点击回调: " );
}
@Override
public void onNaviCancel() {
this.finish();
Log.e(TAG, "取消导航设置点击回调: " );
}
@Override
public boolean onNaviBackClick() {
return false;
}
@Override
public void onNaviMapMode(int i) {
Log.e(TAG, "地图的模式: "+i );
}
@Override
public void onNaviTurnClick() {
Log.e(TAG,"转弯view的点击回调: ");
}
@Override
public void onNextRoadClick() {
Log.e(TAG,"下一个道路View点击回调: ");
}
@Override
public void onScanViewButtonClick() {
}
@Override
public void onLockMap(boolean b) {
}
@Override
public void onNaviViewLoaded() {
}
private void showToast(String str) {
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
}
3.2、常量类:Constans 用来传值
public class Constans {
public static final String LATITUDE = "latitude";
public static final String LONGITUDE = "longitude";
public static final String ENDLATITUDE = "endlatitude";
public static final String ENDLONGITUDE = "endlongitude";
}
3.3、activity_map_navi 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.amap.api.navi.AMapNaviView
android:id="@+id/aMapNaviView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>