百度地图实现普通地图、定位、周边搜索功能

注意:此Demo是用Android Studio实现的

//--------------一下是普通地图的实现-----------------------------------

1:打开百度地图APi进去,如果没有注册过的需要注册,注册过的登录进入

2:点击开发——Android地图SDk——点击获取密钥——点击创建应用——然后你就创建一个新的项目
3:打开你项目下的res——values——string.xml把项目名:比如BaiDuMap复制到应用名称中去
4:应用类型选择:Android SDK
5:发布版SHA1 的获取:打开你电脑的c盘——用户——你的用户名——.android 下面有一个debug.keystore  
   点击键盘Windows+R 进入黑窗口 输入  keytool -list -v -keystore 把keytool -list -v -keystore拖进去(注意:-keystore后面要有一个空格)点击键盘的回车键

6:输入密钥库口令:android (注意都是英文小写)回车键
7:把下面显示的证书指纹中的:SHA1复制到 发布版SHA1
8:打开你项目的清单文件 把包名复制到 包名
9:点击下面的提交
10:就生成了一个Key
11:点击开发指南下的相关下载,下载相关的demo
12:把demo中libs下的除了android-support-v4  全部复制到你的工程的libs下
 点击Android Studio工具栏中的有多个小方块的那个图标
 点击APP再点击Dependencies ——点击加号 ——选择File dependency
把libs下的jar包都添加进去



13:进入百度地图Api的Android定位Sdk 中开发指南中的配置环境 找到
sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
}
复制到 工程下的build.gradle中
如:buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
}

点击右上角的Sync Now 同步一下

14:进入开发指南中的 Hello BaiduMap中 (注意:key值就是刚才我们申请的那个)

 (1)在application中添加开发密钥
<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="开发者 key" />  
</application>
2)添加所需权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
第三步,在布局xml文件中添加地图控件;
<com.baidu.mapapi.map.MapView  
    android:id="@+id/bmapView"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:clickable="true" />

第四步,在应用程序创建时初始化 SDK引用的Context 全局变量:
public class MainActivity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);   
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
        //注意该方法要再setContentView方法之前实现  
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.activity_main);  
    }  
}
注意:在SDK各功能组件使用之前都需要调用
SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中


第四步我是这么做的:新建一个application包,在这个包下新创建一个BaseApplication类并继承Application,实现onCreate的方法
在onCreate中复制 SDKInitializer.initialize(getApplicationContext());进去
如下:

public class BaseApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        SDKInitializer.initialize(getApplicationContext());
    }
}


然后在清单文件中配置:<application下:
<application
        android:name=".application.BaseApplication"//包名


第五步,创建地图Activity,管理地图生命周期;
public class MainActivity extends Activity {  
    MapView mMapView = null;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);   
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
        //注意该方法要再setContentView方法之前实现  
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.activity_main);  
        //获取地图控件引用  
        mMapView = (MapView) findViewById(R.id.bmapView);  
    }  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
        mMapView.onDestroy();  
    }  
    @Override  
    protected void onResume() {  
        super.onResume();  
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
        mMapView.onResume();  
        }  
    @Override  
    protected void onPause() {  
        super.onPause();  
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
        mMapView.onPause();  
        }  
    }
完成以上步骤后,运行程序,即可在您的应用中显示

 

//-------------------以上是普通地图的实现---------------------------------------------------------

 

 

//===============以下是定位功能的实现==========================

一:
1:配置环境 进入Android定位SDK的开发指南中点击配置环境
 
使用AndroidStutio的开发者除了上述操作外,还需要在build.gradle中配置SO文件的使用,如下所示:
sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
}

2:
设置AndroidManifest.xml

在Application标签中声明SERVICE组件,每个APP拥有自己单独的定位SERVICE
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>

  3:声明使用权限
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

4:
设置AcessKey

Android定位SDK4.2及之后版本需要在Mainfest.xml正确设置Accesskey(AK),如果设置错误将会导致定位和地理围栏服务无法正常使用。
设置AK,在Application标签中加入
<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="AK" />       //key:开发者申请的Key

 

//-------------------Activity2-------------------复制一下代码即可-------------代码来源下载的Demo中src下的baidumapsdk下的demo下的map下的LocationDemo------------------------

package com.example.baidumap.activity;

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.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.example.baidumap.R;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class Activity2 extends Activity{
    MapView mMapView = null;  
    // 定位相关
    LocationClient mLocClient;
    public MyLocationListenner myListener = new MyLocationListenner();
    BaiduMap mBaiduMap;
    boolean isFirstLoc = true; // 是否首次定位
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
        setContentView(R.layout.activity_main);
        //获取地图控件引用  
        mMapView = (MapView) findViewById(R.id.bmapView);  
        
        
        mBaiduMap = mMapView.getMap();
        // 开启定位图层
        mBaiduMap.setMyLocationEnabled(true);
        // 定位初始化
        mLocClient = new LocationClient(this);
        mLocClient.registerLocationListener(myListener);
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);
        mLocClient.setLocOption(option);
        mLocClient.start();
        
    }

      /**
     * 定位SDK监听函数
     */
    public class MyLocationListenner implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location == null || mMapView == null) {
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                            // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(ll).zoom(18.0f);
                mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
            }
        }

        public void onReceivePoi(BDLocation poiLocation) {
        }
    }
    
    
      @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            // 退出时销毁定位
            mLocClient.stop();
            // 关闭定位图层
            mBaiduMap.setMyLocationEnabled(false);
            mMapView.onDestroy();
            mMapView = null;
        }  
        @Override  
        protected void onResume() {  
            super.onResume();  
            //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
            mMapView.onResume();  
            }  
        @Override  
        protected void onPause() {  
            super.onPause();  
            //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
            mMapView.onPause();  
            }  

}

 //--------------以上是定位--------------------------------

//================以下是周边搜索功能===========================

注意:实现此功能时,导入了两个类文件,分别是src下的com下的baidu下的mapapi下的overlayutil下的 OverlayManager PoiOverlay

 

//---------------------Activity3中           完成以下就可做一个简单的周边搜索了--------------------------------------------------

package com.example.baidumap.activity;

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.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.CircleOptions;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiBoundSearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchOption;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.baidu.mapapi.search.poi.PoiSortType;
import com.example.baidumap.R;
import com.example.baidumap.activity.Activity2.MyLocationListenner;
import com.example.baidumap.utils.PoiOverlay;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Activity3 extends Activity implements OnGetPoiSearchResultListener{
    MapView mMapView = null;  
    // 定位相关
    LocationClient mLocClient;
    public MyLocationListenner myListener = new MyLocationListenner();
    BaiduMap mBaiduMap;
    boolean isFirstLoc = true; // 是否首次定位
    private EditText et_text;
    private Button bt_button;
    
     private PoiSearch mPoiSearch = null;
     LatLng center = null;
     int radius = 50000;
    
    
//-----------------onCreate-------------------------
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
        setContentView(R.layout.activity_main);
        //找到控件
        et_text = (EditText) findViewById(R.id.et_text);
        bt_button = (Button) findViewById(R.id.bt_nutton);
        //获取地图控件引用  
        mMapView = (MapView) findViewById(R.id.bmapView);  
        
        
        mBaiduMap = mMapView.getMap();
        // 开启定位图层
        mBaiduMap.setMyLocationEnabled(true);
        // 定位初始化
        mLocClient = new LocationClient(this);
        mLocClient.registerLocationListener(myListener);
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);
        mLocClient.setLocOption(option);
        mLocClient.start();
       
        
        // 初始化搜索模块,注册搜索事件监听
        mPoiSearch = PoiSearch.newInstance();
        mPoiSearch.setOnGetPoiSearchResultListener(this);
        
        //点击搜索
        bt_button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                //关闭输入框
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
                 PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption().keyword(et_text.getText()
                            .toString()).sortType(PoiSortType.distance_from_near_to_far).location(center)
                            .radius(radius).pageNum(10);//显示数据个数
                    mPoiSearch.searchNearby(nearbySearchOption);
                
            }
        });
        
    }

      /**
     * 定位SDK监听函数
     */
    public class MyLocationListenner implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location == null || mMapView == null) {
                return;
            }
            
            center=new LatLng(location.getLatitude(), location.getLongitude());
            
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                            // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(ll).zoom(18.0f);
                mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
            }
        }

        public void onReceivePoi(BDLocation poiLocation) {
        }
    }
    
    
      @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            // 退出时销毁定位
            mLocClient.stop();
            // 关闭定位图层
            mBaiduMap.setMyLocationEnabled(false);
            mMapView.onDestroy();
            mMapView = null;
        }  
        @Override  
        protected void onResume() {  
            super.onResume();  
            //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
            mMapView.onResume();  
         }  
        
        @Override  
        protected void onPause() {  
            super.onPause();  
            //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
            mMapView.onPause();  
            
         }
        
        
        
        /**
         * 获取POI详情搜索结果,得到searchPoiDetail返回的搜索结果
         * @param result
         */
        @Override
        public void onGetPoiDetailResult(PoiDetailResult arg0) {
             if (arg0.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(Activity3.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(Activity3.this, arg0.getName() + ": " + arg0.getAddress(), Toast.LENGTH_SHORT).show();
                            
                }            
        }
        
        @Override
        public void onGetPoiIndoorResult(PoiIndoorResult arg0) {
            
            
        }
        
        /**
         * 获取POI搜索结果,包括searchInCity,searchNearby,searchInBound返回的搜索结果
         * @param result
         */
        @Override
        public void onGetPoiResult(PoiResult arg0) {
             if (arg0 == null || arg0.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
                    Toast.makeText(Activity3.this, "未找到结果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
                if (arg0.error == SearchResult.ERRORNO.NO_ERROR) {
                    mBaiduMap.clear();
                    PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);
                    mBaiduMap.setOnMarkerClickListener(overlay);
                    overlay.setData(arg0);
                    overlay.addToMap();
                    overlay.zoomToSpan();
                    
                    showNearbyArea(center, radius);
                        
                  
                    return;
                }
            
        }
        
        
         private class MyPoiOverlay extends PoiOverlay {

                public MyPoiOverlay(BaiduMap baiduMap) {
                    super(baiduMap);
                }

                @Override
                public boolean onPoiClick(int index) {
                    super.onPoiClick(index);
                    PoiInfo poi = getPoiResult().getAllPoi().get(index);
                    // if (poi.hasCaterDetails) {
                    mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
                            .poiUid(poi.uid));
                    // }
                    return true;
                }
            }
        
         /**
             * 对周边检索的范围进行绘制
             * @param center
             * @param radius
             */
            public void showNearbyArea( LatLng center, int radius) {
                //设置中心点
               /* BitmapDescriptor centerBitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
                MarkerOptions ooMarker = new MarkerOptions().position(center).icon(centerBitmap);
                mBaiduMap.addOverlay(ooMarker);*/

                //显示图层
               /* OverlayOptions ooCircle = new CircleOptions().fillColor( 0xCCCCCC00 ).center(center).stroke(new Stroke(5, 0xFFFF00FF )).radius(radius);
                mBaiduMap.addOverlay(ooCircle);*/
            }


}

//===========以上是周边搜索功能==================

//----------------以下是周边搜索的布局文件--------------------------

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout android:layout_width="fill_parent"        
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/et_text"
            android:hint="请输入搜索内容"/>
        <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="周边搜索"
            android:id="@+id/bt_nutton"/>
        
    </LinearLayout>

    <com.baidu.mapapi.map.MapView  
    android:id="@+id/bmapView"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:clickable="true" />

</LinearLayout>

 

posted on 2016-10-16 16:11  巫山老妖  阅读(822)  评论(0编辑  收藏  举报