百度地图——导航(地理编码输入地址获取经纬度)
最近自己在学习百度地图和讯飞语音,这里自己整理点导航方面的。我用的是Android studio 可能和eclipse有点不一样但大体差不多。
一.主要文件
1.如何获取**等步骤自行查询百度官网。。。这里贴需要的主要文件
2.lib包里面放着百度地图需要用的类
我个人不喜欢把jar包和so方法放一块,但是喜欢放一块的也行。要在bulid.gradle里面声明去哪找so方法
3.这里是需要的权限,我是Android5.0系统这个以上的系统要重写下权限获取
<!-- 连接网络权限,用于执行云端语音能力 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 这个权限用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于读取手机当前的状态 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
4.百度地图的key和service
service必须要在jar包添加进去以后才有效不然都是报错(f就是包里面的一个类)
5.初始化
SDK的初始化一定要在setContentView之前!
二.java代码和布局代码
1.布局:
这个是导航的诱导界面,里面有个这里没有给图片报错删掉那一行就行了 不影响功能
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="320dp" android:layout_height="260dp" android:orientation="vertical" android:layout_gravity="center" android:gravity="center"> <ImageView android:id="@+id/enlarge_view_img" android:layout_height="match_parent" android:layout_width="match_parent" android:visibility="gone"/> <LinearLayout android:id="@+id/route_guide_ll" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="center"> <LinearLayout android:id="@+id/time_distance_ll" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="center" android:orientation="horizontal" android:gravity="center"> <TextView android:id="@+id/remain_time_tx" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_marginRight="10dp"/> <TextView android:id="@+id/remain_distance_tx" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" /> <TextView android:id="@+id/current_speed_tx" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="100km/h" android:textSize="14sp" android:layout_marginLeft="10dp" android:gravity="center" /> </LinearLayout> <RelativeLayout android:id="@+id/simple_guide_rl" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp"> <LinearLayout android:id="@+id/simple_go_ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_centerHorizontal="true"> <ImageView android:id="@+id/turn_img" android:layout_width="30dp" android:layout_height="30dp" android:background="@drawable/navi_guide_turn" /> <TextView android:id="@+id/remain_distance" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_toRightOf="@id/turn_img" android:gravity="center" android:layout_marginLeft="8dp"/> <TextView android:id="@+id/go_tx" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_toRightOf="@id/remain_distance" android:layout_marginLeft="8dp" android:gravity="center" android:text="前往" /> </LinearLayout> <TextView android:id="@+id/next_road_tx" android:layout_width="wrap_content" android:layout_height="20dp" android:layout_marginTop="20dp" android:layout_centerHorizontal="true" android:layout_below="@id/simple_go_ll" /> </RelativeLayout> <RelativeLayout android:id="@+id/along_rl" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp"> <LinearLayout android:id="@+id/along_meter_ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:orientation="horizontal"> <TextView android:id="@+id/along_wrods_tx" android:layout_width="wrap_content" android:layout_height="30dp" /> <TextView android:id="@+id/along_meters_tx" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_marginLeft="30dp" /> </LinearLayout> <TextView android:id="@+id/current_road_tx" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_below="@id/along_meter_ll" /> </RelativeLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp" android:layout_gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" android:text="GPS定位:" /> <TextView android:id="@+id/loacte_tx" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" android:text="未定位" /> </LinearLayout> </LinearLayout> </LinearLayout>
2.这个的导航输入地址的界面,我自己还加了一个地图在上面可以去掉。(里面的背景都可以去掉我这里没贴出来)
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.baidu.mapapi.map.MapView android:id="@+id/baiduMapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:focusable="true" /> <RelativeLayout android:id="@+id/li_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:background="@drawable/edittext2"> <LinearLayout android:id="@+id/li_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@+id/bt_search" android:layout_toStartOf="@+id/bt_search" android:orientation="vertical"> <EditText android:id="@+id/ed_1" android:layout_width="match_parent" android:layout_height="40dp" android:hint="我的位置" android:textSize="16sp" android:background="@drawable/edittext2"/> <EditText android:id="@+id/ed_2" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="1dp" android:hint="终点位置" android:textSize="16sp" android:background="@drawable/edittext2"/> </LinearLayout> <Button android:id="@+id/bt_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:background="@drawable/button2" android:text="前往" /> </RelativeLayout> </RelativeLayout>
2.java代码
(1).GuideActivity
package com.example.fire.BaiduMap;
import android.Manifest; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.KeyEvent; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.geocode.GeoCodeOption; import com.baidu.mapapi.search.geocode.GeoCodeResult; import com.baidu.mapapi.search.geocode.GeoCoder; import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener; import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult; import com.baidu.navisdk.adapter.BNCommonSettingParam; import com.baidu.navisdk.adapter.BNOuterLogUtil; import com.baidu.navisdk.adapter.BNOuterTTSPlayerCallback; import com.baidu.navisdk.adapter.BNRoutePlanNode; import com.baidu.navisdk.adapter.BNaviSettingManager; import com.baidu.navisdk.adapter.BaiduNaviManager; import com.example.fire.MainActivity; import com.example.fire.R; import java.io.File; import java.util.ArrayList; import java.util.List; public class GuideActivity extends AppCompatActivity implements OnGetGeoCoderResultListener { private MapView myMapView = null;//地图控件 private BaiduMap myBaiduMap;//百度地图对象 private LocationClient mylocationClient;//定位服务客户对象 private Context context; private float myCurrentX; private MyOrientationListener myOrientationListener;//方向感应器类对象 GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用 //导航 private static final String APP_FOLDER_NAME = "BNSDKSimpleDemo"; private String mSDCardPath = null; public static final String ROUTE_PLAN_NODE = "routePlanNode"; private final static String authBaseArr[] = { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION }; private final static String authComArr[] = { Manifest.permission.READ_PHONE_STATE }; private final static int authBaseRequestCode = 1; private final static int authComRequestCode = 2; private boolean hasInitSuccess = false; private boolean hasRequestComAuth = false; private double lat2,lon2;//经度longitude,纬度latitude @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_guide); (getSupportActionBar()).setDisplayHomeAsUpEnabled(true);//标题栏返回按钮 this.context = this; initView(); initLocation(); Handler h = new Handler(); h.postDelayed(new Runnable() { @Override public void run() { String name = Thread.currentThread().getName(); } }, 500); // 初始化搜索模块,注册事件监听 mSearch = GeoCoder.newInstance(); mSearch.setOnGetGeoCodeResultListener(this); Button bt_search = (Button) findViewById(R.id.bt_search); BNOuterLogUtil.setLogSwitcher(true); bt_search.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { if (BaiduNaviManager.isNaviInited()) { routeplanToNavi(BNRoutePlanNode.CoordinateType.BD09LL); } } }); //权限申请 if (initDirs()) { initNavi(); } } private void initView() { myMapView = (MapView) findViewById(R.id.baiduMapView); myBaiduMap = myMapView.getMap(); //根据给定增量缩放地图级别 MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(17.0f); myBaiduMap.setMapStatus(msu); myMapView.getChildAt(2).setPadding(0, 0, 0, 650);//这是控制缩放控件的位置 EditText ed_1 = findViewById(R.id.ed_1); ed_1.setText(MainActivity.locate); ed_1.setSelection(MainActivity.locate.length()); } private void initLocation() { MyLocationConfiguration.LocationMode locationMode = MyLocationConfiguration.LocationMode.NORMAL; //定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动 mylocationClient = new LocationClient(this); MylocationListener mylistener = new MylocationListener(); //注册监听器 mylocationClient.registerNotifyLocationListener(mylistener); //配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等 LocationClientOption mOption = new LocationClientOption(); //设置坐标类型 mOption.setCoorType("bd09ll"); //设置是否需要地址信息,默认为无地址 mOption.setIsNeedAddress(true); //设置是否打开gps进行定位 mOption.setOpenGps(true); //设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效 int span = 300000; mOption.setScanSpan(span); //设置 LocationClientOption mylocationClient.setLocOption(mOption); //配置定位图层显示方式,三个参数的构造器 MyLocationConfiguration configuration = new MyLocationConfiguration(locationMode, true, null); //设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效,参见 setMyLocationEnabled(boolean) myBaiduMap.setMyLocationConfiguration(configuration); myOrientationListener = new MyOrientationListener(context); //通过接口回调来实现实时方向的改变 myOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() { @Override public void onOrientationChanged(float x) { myCurrentX = x; } }); } private boolean initDirs() { mSDCardPath = getSdcardDir(); if (mSDCardPath == null) { return false; } File f = new File(mSDCardPath, APP_FOLDER_NAME); if (!f.exists()) { try { f.mkdir(); } catch (Exception e) { e.printStackTrace(); return false; } } return true; } String authinfo = null; /** * 内部TTS播报状态回传handler */ private Handler ttsHandler = new Handler() { public void handleMessage(Message msg) { int type = msg.what; switch (type) { case BaiduNaviManager.TTSPlayMsgType.PLAY_START_MSG: { // showToastMsg("Handler : TTS play start"); break; } case BaiduNaviManager.TTSPlayMsgType.PLAY_END_MSG: { // showToastMsg("Handler : TTS play end"); break; } default: break; } } }; /** * 内部TTS播报状态回调接口 */ private BaiduNaviManager.TTSPlayStateListener ttsPlayStateListener = new BaiduNaviManager.TTSPlayStateListener() { @Override public void playEnd() { } @Override public void playStart() { } }; private boolean hasBasePhoneAuth() { // TODO Auto-generated method stub PackageManager pm = this.getPackageManager(); for (String auth : authBaseArr) { if (pm.checkPermission(auth, this.getPackageName()) != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } private boolean hasCompletePhoneAuth() { // TODO Auto-generated method stub PackageManager pm = this.getPackageManager(); for (String auth : authComArr) { if (pm.checkPermission(auth, this.getPackageName()) != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } private void initNavi(){ BNOuterTTSPlayerCallback ttsCallback = null; // 申请权限 if (android.os.Build.VERSION.SDK_INT >= 23) { if (!hasBasePhoneAuth()) { this.requestPermissions(authBaseArr, authBaseRequestCode); return; } } BaiduNaviManager.getInstance().init(this, mSDCardPath, APP_FOLDER_NAME, new BaiduNaviManager.NaviInitListener() { @Override public void onAuthResult(int status, String msg) { if (0 == status) { authinfo = "key校验成功!"; } else { authinfo = "key校验失败, " + msg; } GuideActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(GuideActivity.this, authinfo, Toast.LENGTH_LONG).show(); } }); } public void initStart() { Toast.makeText(GuideActivity.this, "百度导航引擎初始化开始", Toast.LENGTH_SHORT).show(); } public void initFailed() { Toast.makeText(GuideActivity.this, "百度导航引擎初始化失败", Toast.LENGTH_SHORT).show(); } public void initSuccess() { Toast.makeText(GuideActivity.this, "百度导航引擎初始化成功", Toast.LENGTH_SHORT).show(); hasInitSuccess = true; initSetting(); } }, null, ttsHandler, ttsPlayStateListener); } private String getSdcardDir() { if (Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) { return Environment.getExternalStorageDirectory().toString(); } return null; } private BNRoutePlanNode.CoordinateType mCoordinateType = null; private void routeplanToNavi(BNRoutePlanNode.CoordinateType coType) { mCoordinateType = coType; if (!hasInitSuccess) { Toast.makeText(GuideActivity.this, "还未初始化!", Toast.LENGTH_SHORT).show(); } // 权限申请 if (android.os.Build.VERSION.SDK_INT >= 23) { // 保证导航功能完备 if (!hasCompletePhoneAuth()) { if (!hasRequestComAuth) { hasRequestComAuth = true; this.requestPermissions(authComArr, authComRequestCode); return; } else { Toast.makeText(GuideActivity.this, "没有完备的权限!", Toast.LENGTH_SHORT).show(); } } } BNRoutePlanNode sNode = null; BNRoutePlanNode eNode = null; switch (coType) { case BD09LL: { final EditText ed_2 = findViewById(R.id.ed_2); mSearch.geocode(new GeoCodeOption().city("杭州").address(ed_2.getText().toString())); sNode = new BNRoutePlanNode(MainActivity.longitude,MainActivity.latitude, MainActivity.locate, null, coType); eNode = new BNRoutePlanNode(lon2, lat2, "", null, coType); break; } } if (sNode != null && eNode != null) { List<BNRoutePlanNode> list = new ArrayList<BNRoutePlanNode>(); list.add(sNode); list.add(eNode); BaiduNaviManager.getInstance().launchNavigator(this, list, 1, true, new DemoRoutePlanListener(sNode), eventListerner); } } BaiduNaviManager.NavEventListener eventListerner = new BaiduNaviManager.NavEventListener() { @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) @Override public void onCommonEventCall(int what, int arg1, int arg2, Bundle bundle) { GuideHandler.getInstance().handleNaviEvent(what, arg1, arg2, bundle); } }; public class DemoRoutePlanListener implements BaiduNaviManager.RoutePlanListener { private BNRoutePlanNode mBNRoutePlanNode = null; public DemoRoutePlanListener(BNRoutePlanNode node) { mBNRoutePlanNode = node; } @Override public void onJumpToNavigator() { Intent intent = new Intent(GuideActivity.this, GuideInduceActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable(ROUTE_PLAN_NODE, (BNRoutePlanNode) mBNRoutePlanNode); intent.putExtras(bundle); startActivity(intent); } @Override public void onRoutePlanFailed() { // TODO Auto-generated method stub Toast.makeText(GuideActivity.this, "算路失败", Toast.LENGTH_SHORT).show(); } } private void initSetting() { BNaviSettingManager.setShowTotalRoadConditionBar(BNaviSettingManager.PreViewRoadCondition.ROAD_CONDITION_BAR_SHOW_ON); BNaviSettingManager.setVoiceMode(BNaviSettingManager.VoiceMode.Veteran); BNaviSettingManager.setRealRoadCondition(BNaviSettingManager.RealRoadCondition.NAVI_ITS_ON); BNaviSettingManager.setIsAutoQuitWhenArrived(true); Bundle bundle = new Bundle(); // 必须设置APPID,否则会静音 bundle.putString(BNCommonSettingParam.TTS_APP_ID, "11237807"); BNaviSettingManager.setNaviSdkParam(bundle); } private BNOuterTTSPlayerCallback mTTSCallback = new BNOuterTTSPlayerCallback() { @Override public void stopTTS() { } @Override public void resumeTTS() { } @Override public void releaseTTSPlayer() { } @Override public int playTTSText(String speech, int bPreempt) { return 1; } @Override public void phoneHangUp() { } @Override public void phoneCalling() { } @Override public void pauseTTS() { } @Override public void initTTSPlayer() { } @Override public int getTTSState() { return 1; } }; @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // TODO Auto-generated method stub super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == authBaseRequestCode) { for (int ret : grantResults) { if (ret == 0) { continue; } else { Toast.makeText(GuideActivity.this, "缺少导航基本的权限!", Toast.LENGTH_SHORT).show(); return; } } initNavi(); } else if (requestCode == authComRequestCode) { for (int ret : grantResults) { if (ret == 0) { continue; } } routeplanToNavi(mCoordinateType); } } /* * 地理编码经纬度与地址之间相互转换 * */ public void onGetGeoCodeResult(GeoCodeResult result) { lon2 = result.getLocation().longitude; lat2 = result.getLocation().latitude; } public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { } /* *根据经纬度前往 */ public void getLocationByLL(double la, double lg) { //地理坐标的数据结构 LatLng latLng = new LatLng(la, lg); //描述地图状态将要发生的变化,通过当前经纬度来使地图显示到该位置 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); myBaiduMap.setMapStatus(msu); } /* *定位请求回调接口 */ public class MylocationListener implements BDLocationListener { //定位请求回调接口 private boolean isFirstIn=true; //定位请求回调函数,这里面会得到定位信息 @Override public void onReceiveLocation(BDLocation bdLocation) { //BDLocation 回调的百度坐标类,内部封装了如经纬度、半径等属性信息 //MyLocationData 定位数据,定位数据建造器 /* * 可以通过BDLocation配置如下参数 * 1.accuracy 定位精度 * 2.latitude 百度纬度坐标 * 3.longitude 百度经度坐标 * 4.satellitesNum GPS定位时卫星数目 getSatelliteNumber() gps定位结果时,获取gps锁定用的卫星数 * 5.speed GPS定位时速度 getSpeed()获取速度,仅gps定位结果时有速度信息,单位公里/小时,默认值0.0f * 6.direction GPS定位时方向角度 * */ double myLatitude = bdLocation.getLatitude(); double myLongitude = bdLocation.getLongitude(); MyLocationData data = new MyLocationData.Builder() .direction(myCurrentX)//设定图标方向 .accuracy(bdLocation.getRadius())//getRadius 获取定位精度,默认值0.0f .latitude(myLatitude)//百度纬度坐标 .longitude(myLongitude)//百度经度坐标 .build(); //设置定位数据, 只有先允许定位图层后设置数据才会生效,参见 setMyLocationEnabled(boolean) myBaiduMap.setMyLocationData(data); //判断是否为第一次定位,是的话需要定位到用户当前位置 if (isFirstIn) { //根据当前所在位置经纬度前往 getLocationByLL(myLatitude, myLongitude); isFirstIn = false; } } } /* * 标题栏返回按钮 * */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish();//销毁activity return true; } return super.onOptionsItemSelected(item); } /* *定位服务的生命周期,达到节省 */ @Override protected void onStart() { super.onStart(); //开启定位,显示位置图标 myBaiduMap.setMyLocationEnabled(true); if(!mylocationClient.isStarted()) { mylocationClient.start(); } myOrientationListener.start(); } @Override protected void onStop() { super.onStop(); //停止定位 myBaiduMap.setMyLocationEnabled(false); mylocationClient.stop(); myOrientationListener.stop(); } @Override protected void onResume() { super.onResume(); myMapView.onResume(); } @Override protected void onPause() { super.onPause(); myMapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); myMapView.onDestroy(); } }
(2).GuideInduceActivity
package com.example.fire.BaiduMap; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import com.baidu.navisdk.adapter.BNRouteGuideManager; import com.baidu.navisdk.adapter.BNRouteGuideManager.CustomizedLayerItem; import com.baidu.navisdk.adapter.BNRouteGuideManager.OnNavigationListener; import com.baidu.navisdk.adapter.BNRoutePlanNode; import com.baidu.navisdk.adapter.BNRoutePlanNode.CoordinateType; import com.baidu.navisdk.adapter.BNaviBaseCallbackModel; import com.baidu.navisdk.adapter.BaiduNaviCommonModule; import com.baidu.navisdk.adapter.NaviModuleFactory; import com.baidu.navisdk.adapter.NaviModuleImpl; import com.example.fire.R; import java.util.ArrayList; import java.util.List; /** * 诱导界面 * * @author sunhao04 * */ public class GuideInduceActivity extends Activity { private final String TAG = GuideActivity.class.getName(); private BNRoutePlanNode mBNRoutePlanNode = null; private BaiduNaviCommonModule mBaiduNaviCommonModule = null; /* * 对于导航模块有两种方式来实现发起导航。 1:使用通用接口来实现 2:使用传统接口来实现 * */ // 是否使用通用接口 private boolean useCommonInterface = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); createHandler(); View view = null; if (useCommonInterface) { //使用通用接口 mBaiduNaviCommonModule = NaviModuleFactory.getNaviModuleManager().getNaviCommonModule( NaviModuleImpl.BNaviCommonModuleConstants.ROUTE_GUIDE_MODULE, this, BNaviBaseCallbackModel.BNaviBaseCallbackConstants.CALLBACK_ROUTEGUIDE_TYPE, mOnNavigationListener); if(mBaiduNaviCommonModule != null) { mBaiduNaviCommonModule.onCreate(); view = mBaiduNaviCommonModule.getView(); } } else { //使用传统接口 view = BNRouteGuideManager.getInstance().onCreate(this,mOnNavigationListener); } if (view != null) { setContentView(view); } Intent intent = getIntent(); if (intent != null) { Bundle bundle = intent.getExtras(); if (bundle != null) { mBNRoutePlanNode = (BNRoutePlanNode) bundle.getSerializable(GuideActivity.ROUTE_PLAN_NODE); } } //显示自定义图标 if (hd != null) { hd.sendEmptyMessageAtTime(MSG_SHOW, 5000); } GuideHandler.getInstance().getDialog(this); GuideHandler.getInstance().showDialog(); } @Override protected void onResume() { super.onResume(); if(useCommonInterface) { if(mBaiduNaviCommonModule != null) { mBaiduNaviCommonModule.onResume(); } } else { BNRouteGuideManager.getInstance().onResume(); } } protected void onPause() { super.onPause(); if(useCommonInterface) { if(mBaiduNaviCommonModule != null) { mBaiduNaviCommonModule.onPause(); } } else { BNRouteGuideManager.getInstance().onPause(); } }; @Override protected void onDestroy() { super.onDestroy(); if(useCommonInterface) { if(mBaiduNaviCommonModule != null) { mBaiduNaviCommonModule.onDestroy(); } } else { BNRouteGuideManager.getInstance().onDestroy(); } GuideHandler.getInstance().disposeDialog(); } @Override protected void onStop() { super.onStop(); if(useCommonInterface) { if(mBaiduNaviCommonModule != null) { mBaiduNaviCommonModule.onStop(); } } else { BNRouteGuideManager.getInstance().onStop(); } } /*/ * (non-Javadoc) * @see android.app.Activity#onBackPressed() * 此处onBackPressed传递false表示强制退出,true表示返回上一级,非强制退出 */ @Override public void onBackPressed() { if(useCommonInterface) { if(mBaiduNaviCommonModule != null) { mBaiduNaviCommonModule.onBackPressed(true); } } else { BNRouteGuideManager.getInstance().onBackPressed(false); } } public void onConfigurationChanged(android.content.res.Configuration newConfig) { super.onConfigurationChanged(newConfig); if(useCommonInterface) { if(mBaiduNaviCommonModule != null) { mBaiduNaviCommonModule.onConfigurationChanged(newConfig); } } else { BNRouteGuideManager.getInstance().onConfigurationChanged(newConfig); } }; @Override public boolean onKeyDown(int keyCode, android.view.KeyEvent event) { if(useCommonInterface) { if(mBaiduNaviCommonModule != null) { Bundle mBundle = new Bundle(); mBundle.putInt(RouteGuideModuleConstants.KEY_TYPE_KEYCODE, keyCode); mBundle.putParcelable(RouteGuideModuleConstants.KEY_TYPE_EVENT, event); mBaiduNaviCommonModule.setModuleParams(RouteGuideModuleConstants.METHOD_TYPE_ON_KEY_DOWN, mBundle); try { Boolean ret = (Boolean)mBundle.get(RET_COMMON_MODULE); if(ret) { return true; } }catch(Exception e){ e.printStackTrace(); } } } return super.onKeyDown(keyCode, event); } @Override protected void onStart() { super.onStart(); // TODO Auto-generated method stub if(useCommonInterface) { if(mBaiduNaviCommonModule != null) { mBaiduNaviCommonModule.onStart(); } } else { BNRouteGuideManager.getInstance().onStart(); } } private void addCustomizedLayerItems() { List<CustomizedLayerItem> items = new ArrayList<CustomizedLayerItem>(); CustomizedLayerItem item1 = null; if (mBNRoutePlanNode != null) { item1 = new CustomizedLayerItem(mBNRoutePlanNode.getLongitude(), mBNRoutePlanNode.getLatitude(), mBNRoutePlanNode.getCoordinateType(), getResources().getDrawable(R.drawable.icon_marka), CustomizedLayerItem.ALIGN_CENTER); items.add(item1); BNRouteGuideManager.getInstance().setCustomizedLayerItems(items); } BNRouteGuideManager.getInstance().showCustomizedLayer(true); } private static final int MSG_SHOW = 1; private static final int MSG_HIDE = 2; private static final int MSG_RESET_NODE = 3; private Handler hd = null; private void createHandler() { if (hd == null) { hd = new Handler(getMainLooper()) { public void handleMessage(android.os.Message msg) { if (msg.what == MSG_SHOW) { addCustomizedLayerItems(); } else if (msg.what == MSG_HIDE) { BNRouteGuideManager.getInstance().showCustomizedLayer(false); } else if (msg.what == MSG_RESET_NODE) { BNRouteGuideManager.getInstance().resetEndNodeInNavi( new BNRoutePlanNode(120.159643, 30.320937, "浙江树人大学致和园", null, CoordinateType.GCJ02)); } }; }; } } private OnNavigationListener mOnNavigationListener = new OnNavigationListener() { @Override public void onNaviGuideEnd() { //退出导航 finish(); } @Override public void notifyOtherAction(int actionType, int arg1, int arg2, Object obj) { if (actionType == 0) { //导航到达目的地 自动退出 Log.i(TAG, "notifyOtherAction actionType = " + actionType + ",导航到达目的地!"); } Log.i(TAG, "actionType:" + actionType + "arg1:" + arg1 + "arg2:" + arg2 + "obj:" + obj.toString()); } }; private final static String RET_COMMON_MODULE = "module.ret"; private interface RouteGuideModuleConstants { final static int METHOD_TYPE_ON_KEY_DOWN = 0x01; final static String KEY_TYPE_KEYCODE = "keyCode"; final static String KEY_TYPE_EVENT = "event"; } }
(3).GuideHandler
package com.example.fire.BaiduMap; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Build; import android.os.Bundle; import android.support.annotation.RequiresApi; import android.text.TextUtils; import android.util.Log; import com.baidu.navisdk.adapter.BNaviCommonParams; public class GuideHandler { private GuideDialog mEventDialog = null; private static class LazyLoader { private static GuideHandler mInstance = new GuideHandler(); } public static GuideHandler getInstance() { return LazyLoader.mInstance; } private GuideHandler() { } public GuideDialog getDialog(Context ctx) { if (mEventDialog == null) { mEventDialog = new GuideDialog(ctx); } return mEventDialog; } public void showDialog() { if (mEventDialog != null) { mEventDialog.setCanceledOnTouchOutside(false); mEventDialog.show(); } } public void dismissDialog() { if (mEventDialog != null) { mEventDialog.dismiss(); } } public void disposeDialog() { mEventDialog = null; } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) public void handleNaviEvent(int what, int arg1, int arg2, Bundle bundle) { Log.i("onCommonEventCall", String.format("%d,%d,%d,%s", what, arg1, arg2, (bundle == null ? "" : bundle.toString()))); switch (what) { case BNaviCommonParams.MessageType.EVENT_NAVIGATING_STATE_BEGIN: break; case BNaviCommonParams.MessageType.EVENT_NAVIGATING_STATE_END: break; case BNaviCommonParams.MessageType.EVENT_GPS_LOCATED: mEventDialog.updateLocateState(true); break; case BNaviCommonParams.MessageType.EVENT_GPS_DISMISS: mEventDialog.updateLocateState(false); break; case BNaviCommonParams.MessageType.EVENT_ON_YAW_SUCCESS: break; case BNaviCommonParams.MessageType.EVENT_ROAD_TURN_ICON_UPDATE: byte[] byteArray = bundle.getByteArray(BNaviCommonParams.BNGuideKey.ROAD_TURN_ICON); Bitmap map = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); mEventDialog.updateTurnIcon(map); break; case BNaviCommonParams.MessageType.EVENT_ROAD_TURN_DISTANCE_UPDATE: String turndis = bundle.getString(BNaviCommonParams.BNGuideKey.TROAD_TURN_DISTANCE); mEventDialog.updateGoDistanceTx(turndis); mEventDialog.updateAlongMeters(turndis); break; case BNaviCommonParams.MessageType.EVENT_ROAD_NEXT_ROAD_NAME: String nextRoad = bundle.getString(BNaviCommonParams.BNGuideKey.NEXT_ROAD_NAME); if (!TextUtils.isEmpty(nextRoad)) { mEventDialog.updateNextRoad(nextRoad); } break; case BNaviCommonParams.MessageType.EVENT_ROAD_CURRENT_ROAD_NAME: String currentRoad = bundle.getString(BNaviCommonParams.BNGuideKey.CURRENT_ROAD_NAME); if (!TextUtils.isEmpty(currentRoad)) { mEventDialog.updateCurrentRoad(currentRoad); } break; case BNaviCommonParams.MessageType.EVENT_REMAIN_DISTANCE_UPDATE: String remainDisctance = bundle.getString(BNaviCommonParams.BNGuideKey.TOTAL_REMAIN_DISTANCE); mEventDialog.updateRemainDistance(remainDisctance); break; case BNaviCommonParams.MessageType.EVENT_REMAIN_TIME_UPDATE: String remainTime = bundle.getString(BNaviCommonParams.BNGuideKey.TOTAL_REMAIN_TIME); mEventDialog.updateRemainTime(remainTime); break; case BNaviCommonParams.MessageType.EVENT_RASTER_MAP_SHOW: int type = bundle.getInt(BNaviCommonParams.BNEnlargeRoadKey.ENLARGE_TYPE); byte[] arrowByte = bundle.getByteArray(BNaviCommonParams.BNEnlargeRoadKey.ARROW_IMAGE); byte[] bgByte = bundle.getByteArray(BNaviCommonParams.BNEnlargeRoadKey.BACKGROUND_IMAGE); Bitmap arrowMap = BitmapFactory.decodeByteArray(arrowByte, 0, arrowByte.length); Bitmap bgMap = BitmapFactory.decodeByteArray(bgByte, 0, bgByte.length); mEventDialog.onEnlageShow(type, arrowMap, bgMap); break; case BNaviCommonParams.MessageType.EVENT_RASTER_MAP_UPDATE: String remainDistance = bundle.getString(BNaviCommonParams.BNEnlargeRoadKey.REMAIN_DISTANCE); String roadName = bundle.getString(BNaviCommonParams.BNEnlargeRoadKey.ROAD_NAME); int progress = bundle.getInt(BNaviCommonParams.BNEnlargeRoadKey.DRIVE_PROGRESS); break; case BNaviCommonParams.MessageType.EVENT_RASTER_MAP_HIDE: mEventDialog.onEnlargeHide(); break; case BNaviCommonParams.MessageType.EVENT_ROUTE_PLAN_SUCCESS: int distance = bundle.getInt(BNaviCommonParams.BNRouteInfoKey.TOTAL_DISTANCE); int time = bundle.getInt(BNaviCommonParams.BNRouteInfoKey.TOTAL_TIME); int tollFees = bundle.getInt(BNaviCommonParams.BNRouteInfoKey.TOLL_FESS); int lightCounts = bundle.getInt(BNaviCommonParams.BNRouteInfoKey.TRAFFIC_LIGHT); int gasMoney = bundle.getInt(BNaviCommonParams.BNRouteInfoKey.GAS_MONEY); break; case BNaviCommonParams.MessageType.EVENT_SERVICE_AREA_UPDATE: String firstName = bundle.getString(BNaviCommonParams.BNGuideKey.FIRST_SERVICE_NAME); int firstDistance = bundle.getInt(BNaviCommonParams.BNGuideKey.FIRST_SERVICE_TIME); String secondeName = bundle.getString(BNaviCommonParams.BNGuideKey.SECOND_SERVICE_NAME); int secondeDistance = bundle.getInt(BNaviCommonParams.BNGuideKey.SECOND_SERVICE_TIME); break; case BNaviCommonParams.MessageType.EVENT_CURRENT_SPEED: mEventDialog.updateCurrentSpeed(String.valueOf(arg1)); break; case BNaviCommonParams.MessageType.EVENT_ALONG_UPDATE: boolean isAlong = bundle.getBoolean(BNaviCommonParams.BNGuideKey.IS_ALONG); break; case BNaviCommonParams.MessageType.EVENT_CURRENT_MILES: int miles = arg1; default : break; } } }
(4).GuideDialog
package com.example.fire.BaiduMap; import android.app.Dialog; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.RequiresApi; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.example.fire.R; public class GuideDialog extends Dialog { private Context mContext; private LinearLayout mRouteGuideLl; private TextView mRemainTimeTx; private TextView mRemainDistanceTx; // 剩余总距离 private TextView mCurrentSpeedTx; private ImageView mTurnImage; private TextView mGoDistanceTx; private TextView mNextRoadTx; private TextView mAlongMeters; private TextView mCurrentRoadTx; private ImageView mEnlargeImg; private TextView mLocateTx; public GuideDialog(Context context) { super(context); mContext = context; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); LayoutInflater infalter = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = infalter.inflate(R.layout.activity_guidedialog, null); setContentView(layout); Window window = this.getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); lp.width = 700; lp.height = 700; window.setAttributes(lp); window.setGravity(Gravity.BOTTOM | Gravity.LEFT); mRouteGuideLl = (LinearLayout) layout.findViewById(R.id.route_guide_ll); mRemainTimeTx = (TextView) layout.findViewById(R.id.remain_time_tx); mRemainDistanceTx = (TextView) layout.findViewById(R.id.remain_distance_tx); mCurrentSpeedTx = (TextView) layout.findViewById(R.id.current_speed_tx); mTurnImage = (ImageView) layout.findViewById(R.id.turn_img); mGoDistanceTx = (TextView) layout.findViewById(R.id.remain_distance); mNextRoadTx = (TextView) layout.findViewById(R.id.next_road_tx); mAlongMeters = (TextView) layout.findViewById(R.id.along_meters_tx); mCurrentRoadTx = (TextView) layout.findViewById(R.id.current_road_tx); mEnlargeImg = (ImageView) layout.findViewById(R.id.enlarge_view_img); mLocateTx = (TextView) layout.findViewById(R.id.loacte_tx); } public void updateLocateState(boolean hasLocate) { if (mLocateTx != null) { mLocateTx.setText(hasLocate ? "定位成功" : "定位中"); } } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) public void onEnlageShow(int type, Bitmap arrowBmp, Bitmap bgBmp) { if (mEnlargeImg != null) { mEnlargeImg.setImageBitmap(arrowBmp); mEnlargeImg.setBackground(new BitmapDrawable(bgBmp)); mEnlargeImg.setVisibility(View.VISIBLE); } if (mRouteGuideLl != null) { mRouteGuideLl.setVisibility(View.GONE); } } public void onEnlargeHide() { if (mEnlargeImg != null) { mEnlargeImg.setVisibility(View.GONE); } if (mRouteGuideLl != null) { mRouteGuideLl.setVisibility(View.VISIBLE); } } public void updateTurnIcon(Bitmap map) { if (mTurnImage != null) { mTurnImage.setImageBitmap(map); } } public void updateGoDistanceTx(String tx) { if (mGoDistanceTx != null) { mGoDistanceTx.setText(tx); } } public void updateNextRoad(String nextRoad) { if (mNextRoadTx != null) { mNextRoadTx.setText(nextRoad); } } public void updateAlongMeters(String alongMeters) { if (mAlongMeters != null) { mAlongMeters.setText(alongMeters); } } public void updateCurrentRoad(String currentRoad) { if (mCurrentRoadTx != null) { mCurrentRoadTx.setText(currentRoad); } } public void updateCurrentSpeed(String speed) { if (mCurrentSpeedTx != null) { mCurrentSpeedTx.setText(speed); } } public void updateRemainDistance(String distance) { if (mRemainDistanceTx != null) { mRemainDistanceTx.setText(distance); } } public void updateRemainTime(String time) { if (mRemainTimeTx != null) { mRemainTimeTx.setText(time); } } }
(5).MyOrientationListener 方向感应
package com.example.mymap; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; public class MyOrientationListener implements SensorEventListener{ private SensorManager mSensorManager; private Sensor mSensor; private Context mContext; private float lastX; private OnOrientationListener mOnOrientationListener; public MyOrientationListener(Context context) { this.mContext=context; } public void start() { mSensorManager= (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); if(mSensorManager!= null) { //获得方向传感器 mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); } //判断是否有方向传感器 if(mSensor!=null) { //注册监听器 mSensorManager.registerListener(this,mSensor,SensorManager.SENSOR_DELAY_UI); } } public void stop() { mSensorManager.unregisterListener(this); } //方向改变 @Override public void onSensorChanged(SensorEvent event) { if(event.sensor.getType()==Sensor.TYPE_ORIENTATION) { float x=event.values[SensorManager.DATA_X]; if(Math.abs(x-lastX)>1.0) { if(mOnOrientationListener!=null) { mOnOrientationListener.onOrientationChanged(x); } } lastX=x; } } public void setOnOrientationListener(OnOrientationListener listener) { mOnOrientationListener=listener; } public interface OnOrientationListener { void onOrientationChanged(float x); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }这里附上我自己的demo点击打开链接
(导航如果没有声音是因为没有申请tts,在这个链接里面申请百度语音)