安卓百度地图开发文档
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接口来实现:
返回的结果如下:
{
"status":"OK",
"result":{
"location":{
"lng":118.803861,
"lat":32.00149
},
"precise":1,
"confidence":80,
"level":"\u5546\u52a1\u5927\u53a6"
}