安卓百度地图开发文档

1.      申请API key

利用jdk工具生成,进入jdk 的bin目录下,
输入keytool -genkey -alias androiddebugkey-keyalg RSA -validity 20000 -keystore debug.keystore -storepass android-keypass android,并根据中文提升输入基本信息(测试key可以随便填)。最后输入y确认,最后可以在jdk的bin目录下找到生成的debug.keystore。

之后再输入keytool -list -v-keystore debug.keystore可以查看生成的证书信息,在百度地图开发平台上创建新的应用,输入相应的SHAI信息,创建Android应用,即可生成API key。

2.      配置百度地图开发环境

(1)在链接下下载相应的开发包。下载完将压缩包中的jar包导入到工程目录下的libs文件夹中,在src/main目录下新建jniLibs目录,将所有的so文件放到这个目录中,新建assets目录,将剩下的assets目录下的所有资源放到这个目录下。

(2)在Application中配置自己的API key

<meta-data
     android:name="com.baidu.lbsapi.API_KEY"
     android:value="申请的API key" />

(3)配置所需要的权限信息:


1.   !-- 百度API所需权限 -->  
2.       <uses-permission android:name="android.permission.GET_ACCOUNTS"
3.       <uses-permission android:name="android.permission.USE_CREDENTIALS"
4.       <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"
5.       <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"
6.       <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
7.       <uses-permission android:name="android.permission.INTERNET"
8.       <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"
9.       <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"
10.      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"
11.      <uses-permission android:name="android.permission.READ_PHONE_STATE"
12.      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
13.      <uses-permission android:name="android.permission.BROADCAST_STICKY"
14.      <uses-permission android:name="android.permission.WRITE_SETTINGS"
15.      <uses-permission android:name="android.permission.READ_PHONE_STATE"


(4)注册定位的service

<service
     android:name="com.baidu.location.f"
     android:enabled="true"
     android:process=":remote">
     <intent-filter>
         <action android:name="com.baidu.location.service_v2.2"></action>
     </intent-filter>
 </service>

3.      多种功能的使用

(1)MapView的使用(显示地图信息)

布局文件:

<com.baidu.mapapi.map.MapView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/mapView">
 </com.baidu.mapapi.map.MapView>

MainActivity:

public class MainActivity extends AppCompatActivity {
     private MapView mapView;
     private BaiduMap map;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         SDKInitializer.initialize(getApplicationContext());
         setContentView(R.layout.activity_main);
         mapView=(MapView)findViewById(R.id.mMap);
     }

     @Override
     protected void onPause() {
         super.onPause();
         mapView.onPause();
     }

     @Override
     protected void onDestroy() {
         super.onDestroy();
         mapView.onDestroy();
     }

     @Override
     protected void onPostResume() {
         super.onPostResume();
         mapView.onResume();
     }
 }

 

(2)让地图定位到自己的位置

public class MainActivity extends AppCompatActivity {
     private MapView mapView;
     private BaiduMap map;
     private LocationClient locationClient;
     private boolean isFirstLocation=true;


     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         SDKInitializer.initialize(getApplicationContext());
         //定位自己的位置,成功会回调MylocationListener中的onReceiveLocation方法
         locationClient=new LocationClient(getApplicationContext());
         locationClient.registerLocationListener(new MyLocationListener());

         setContentView(R.layout.activity_main);
         mapView=(MapView)findViewById(R.id.mMap);
         map=mapView.getMap();

     }
     //让地图移动到自己的位置,isFirstLocation为了防止多次调用animateMapStatus方法
     private void navigateTo(BDLocation location){
         if (isFirstLocation){
             LatLng latLng=new LatLng(location.getLatitude(),location.getLongitude());
             MapStatusUpdate update=MapStatusUpdateFactory.newLatLng(latLng);
             map.animateMapStatus(update);
             update=MapStatusUpdateFactory.zoomTo(16f);
             map.animateMapStatus(update);
             isFirstLocation=false;
         }
         //获取location中的坐标,并让自己显示在地图上
         MyLocationData.Builder builder=new MyLocationData.Builder();
         builder.latitude(location.getLatitude());
         builder.longitude(location.getLongitude());
         MyLocationData data=builder.build();
         map.setMyLocationData(data);
     }
     public class MyLocationListener implements BDLocationListener{
         @Override
         public void onReceiveLocation(BDLocationbdLocation) {
             navigateTo(bdLocation);
         }
     }

     //实现每隔五秒实时定位到自己的位置
     @Override
     protected void onStart() {
         super.onStart();
         locationClient.start();
         LocationClientOption option=new LocationClientOption();
         option.setScanSpan(5000);
         locationClient.setLocOption(option);
     }

     @Override
     protected void onPause() {
         super.onPause();
         mapView.onPause();
     }

     @Override
     protected void onDestroy() {
         super.onDestroy();
         mapView.onDestroy();
         locationClient.stop();
     }

     @Override
     protected void onPostResume() {
         super.onPostResume();
         mapView.onResume();
     }
 }

(3)导航功能的实现

public class MainActivity extends AppCompatActivity {
     private LocationClient client;
     private BaiduMap map;
     private MapView mapView;
     private Button button;
     private boolean isFirstedLocation = true;
     private LatLng mLastLocationData;
     private MyLocationData locData;
     Marker marker = null;
     // 导航相关
     private static final String TAG = "MainActivity";
     private static final String APP_FOLDER_NAME = "BNSDKDemo";
     public static final String ROUTE_PLAN_NODE = "routePlanNode";
     private String mSDCardPath = null;
     String authinfo = null;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         // 在使用SDK各组件之前初始化context信息,传入ApplicationContext
         SDKInitializer.initialize(getApplicationContext());
         setContentView(R.layout.activity_main);
         mapView=(MapView)findViewById(R.id.mMap);
         map=mapView.getMap();
         map.setMapType(BaiduMap.MAP_TYPE_NORMAL);
         button=(Button)findViewById(R.id.b1);
         //------导航开始---------
         initLiastener();
         if (initDirs()){
             initNavi();
         }
     }
     private void initLiastener(){
         button.setOnClickListener(new View.OnClickListener(){
             @Override
             public void onClick(View view) {
                 if (BaiduNaviManager.isNaviInited()){
                     routeplanToNavi();
                 }
             }
         });
     }
private void routeplanToNavi(){
         //定位方式
         BNRoutePlanNode.CoordinateTypecoordinateType= BNRoutePlanNode.CoordinateType.WGS84;
         //定义起点和终点,需要传入两点的经纬度坐标和地名,定位方式
         BNRoutePlanNode sNode=null;
         BNRoutePlanNode eNode=null;
         sNode = new BNRoutePlanNode(116.30142, 40.05087,
                 "百度大厦", null, coordinateType);
         eNode = new BNRoutePlanNode(116.39750, 39.90882,
                 "北京天安门", null, coordinateType);
         if (sNode!=null&&eNode!=null){
            List<BNRoutePlanNode>list=new  ArrayList<BNRoutePlanNode>();
             list.add(sNode);
             list.add(eNode);
             //将list传入launchNavigator,之后成功会回调RoutePlanListener中的onJumpToNavigator()方法
             BaiduNaviManager.getInstance().launchNavigator(this,list,1,true,new DemoRoutePlanListener(sNode));
         }
     }


public class DemoRoutePlanListener implements BaiduNaviManager.RoutePlanListener{
         private BNRoutePlanNode mBnRoutePlanNode=null;
         public DemoRoutePlanListener(BNRoutePlanNodenode){
             mBnRoutePlanNode=node;
         }
         @Override
         public void onJumpToNavigator() {
             Intent intent=new Intent(MainActivity.this,BNDemoGuideActivity.class);
             Bundle bundle=new Bundle();
             bundle.putSerializable(ROUTE_PLAN_NODE,(BNRoutePlanNode)mBnRoutePlanNode);
             intent.putExtras(bundle);
             startActivity(intent);
         }
         @Override
         public void onRoutePlanFailed() {
             
         }
     }
     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;
     }

     private String getSdcardDir() {
         if (Environment.getExternalStorageState().equalsIgnoreCase(
                 Environment.MEDIA_MOUNTED)) {
             return Environment.getExternalStorageDirectory().toString();
         }
         return null;
     }
     // 导航 初始化引擎
     private void initNavi() {
//     BaiduNaviManager.getInstance().setNativeLibraryPath(
 //              mSDCardPath +"/BaiduNaviSDK_SO");
         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;
                         }
                         MainActivity.this.runOnUiThread(new Runnable() {

                             @Override
                             public void  run() {
                                 Toast.makeText(MainActivity.this, authinfo,
                                         Toast.LENGTH_LONG).show();
                             }
                         });
                     }

                     public void initSuccess() {
                         Toast.makeText(MainActivity.this, "百度导航引擎初始化成功",
                                 Toast.LENGTH_SHORT).show();
                     }

                     public void initStart() {
                         Toast.makeText(MainActivity.this, "百度导航引擎初始化开始",
                                 Toast.LENGTH_SHORT).show();
                     }

                     public void initFailed() {
                         Toast.makeText(MainActivity.this, "百度导航引擎初始化失败",
                                 Toast.LENGTH_SHORT).show();
                     }
                 },mTTSCallback);
     }



 

private BNOuterTTSPlayerCallback mTTSCallback = new BNOuterTTSPlayerCallback(){

         @Override
         public void stopTTS() {
             // TODO Auto-generated method stub

         }

         @Override
         public void resumeTTS() {
             // TODO Auto-generated method stub

         }

         @Override
         public void releaseTTSPlayer() {
             // TODO Auto-generated method stub

         }

         @Override
         public int playTTSText(String speech, int bPreempt) {
             // TODO Auto-generated method stub
             return 0;
         }

         @Override
         public void phoneHangUp() {
             // TODO Auto-generated method stub

         }

         @Override
         public void phoneCalling() {
             // TODO Auto-generated method stub

         }

         @Override
         public void pauseTTS() {
             // TODO Auto-generated method stub

         }

         @Override
         public void initTTSPlayer() {
             // TODO Auto-generated method stub

         }

         @Override
         public int getTTSState() {
             // TODO Auto-generated method stub
             return 0;
         }
     };
}

在导航开始时需要进行一系列的初始化操作,我们在实际使用时只需要在routeplanToNavi()方法中去传入我们想要导航的起点和终点的经纬度坐标、地名和定位方式,其他的不需要修改。在onJumpToNavigator()方法中intent的第二个对象BNDemoGuideActivity也是封装好的,具体的代码如下:

public class BNDemoGuideActivityextends Activity {

     private BNRoutePlanNode mBNRoutePlanNode = null;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         createHandler();
         if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.HONEYCOMB) {}
         View view = BNRouteGuideManager.getInstance().onCreate(this, new BNRouteGuideManager.OnNavigationListener(){

             @Override
             public void onNaviGuideEnd() {
                 finish();
             }

             @Override
             public void notifyOtherAction(int actionType, int arg1, int  arg2, Object obj) {

             }
         });

         if ( view != null ) {
             setContentView(view);
         }

         Intent intent = getIntent();
         if (intent != null) {
             Bundle bundle =intent.getExtras();
             if (bundle != null) {
                 mBNRoutePlanNode = (BNRoutePlanNode)bundle.getSerializable(MainActivity.ROUTE_PLAN_NODE);
             }
         }
     }

     @Override
     protected void onResume() {
         BNRouteGuideManager.getInstance().onResume();
         super.onResume();

         hd.sendEmptyMessageDelayed(MSG_SHOW, 5000);
     }

     protected void onPause() {
         super.onPause();
         BNRouteGuideManager.getInstance().onPause();
     };

     @Override
     protected void onDestroy() {
         BNRouteGuideManager.getInstance().onDestroy();
         super.onDestroy();
     }

     @Override
     protected void onStop() {
         BNRouteGuideManager.getInstance().onStop();
         super.onStop();
     }

     @Override
     public void onBackPressed() {
         BNRouteGuideManager.getInstance().onBackPressed(false);
     }

     public void onConfigurationChanged(android.content.res.ConfigurationnewConfig) {
         BNRouteGuideManager.getInstance().onConfigurationChanged(newConfig);
         super.onConfigurationChanged(newConfig);
     };

     private void addCustomizedLayerItems() {
        List<BNRouteGuideManager.CustomizedLayerItem> items = new ArrayList<BNRouteGuideManager.CustomizedLayerItem>();
         BNRouteGuideManager.CustomizedLayerItemitem1 = null;
         if (mBNRoutePlanNode != null) {
             item1 = new BNRouteGuideManager.CustomizedLayerItem(mBNRoutePlanNode.getLongitude(), mBNRoutePlanNode.getLatitude(),
                     mBNRoutePlanNode.getCoordinateType(), getResources().getDrawable(R.mipmap.ic_launcher), BNRouteGuideManager.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 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();
//                     hd.sendEmptyMessageDelayed(MSG_HIDE, 5000);
                     } else if ( msg.what  == MSG_HIDE ) {
                        BNRouteGuideManager.getInstance().showCustomizedLayer(false);
//                     hd.sendEmptyMessageDelayed(MSG_SHOW, 5000);
                     }

                 };
             };
         }
     }
 }

这个界面就是我们使用导航功能时跳转到的界面,我们直接使用就好。

此外,关于通过输入的地名获取经纬度的方法,可以调用如下的api接口来实现:

http://api.map.baidu.com/geocoder?address=%E5%8D%97%E4%BA%AC%E6%9D%9C%E5%85%8B%E5%95%86%E5%8A%A1&output=json&key=37492c0ee6f924cb5e934fa08c6b1676

返回的结果如下:

{
   "status":"OK",
   "result":{
       "location":{
           "lng":118.803861,
           "lat":32.00149
       },
       "precise":1,
       "confidence":80,
       "level":"\u5546\u52a1\u5927\u53a6"
    }