0:注册key

http://lbsyun.baidu.com/apiconsole/key/create

关于如何创建SHA1 请参考:里面的AndroidStudio 中使用 百度地图 <一> 百度地图的导入和集成,个人摘要

得到key 0vuea4B0323lkNglN6Rbekbk

1:然后将百度SDK集成进去,以及将百度定位的SDK也集成进去,

下载百度SDK,然后导入Android Studio 中,进行集成,

---------------------------------------
将jar包放到libs 里面,然后右键,在菜单里面选择“add as libary”
然后再main 的文件夹下新建jniLibs。
将除了jar文件的文件夹放到jniLibs里面了。
点击rebuild,或者右边栏的gradle的刷新按钮。
--------------------------------------


百度定位SDK

下载后,进行集成,和上面一样,



2:导入key,以及权限,还有service

    <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" />
    <!-- 这个权限用于进行网络定位-->
    <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>
    
<application
        。。。。
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="0vuea4B0323lkNglN6Rbekbk" />

        <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
        </service>
	。。。
    </application>

</manifest>

3:然后在onCreate 方法里面执行

SDKInitializer.initialize(getApplicationContext());
记住一定要在setContentView 之前

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
    }
}

4: 布局里面添加一个MapView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

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


5:然后在onCreate方法里面获取,记得在onPause,onResume 和onDestroy的方法里面要对MapView 的声明周期做相应的操作。

并且通过这个MapView 获取一个map的对象。

public class MainActivity extends AppCompatActivity implements BDLocationListener {

    private MapView mMapView;
    private BaiduMap mMap;
    private LocationClient mLocationClient;

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

    }

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

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

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

6:开始定位

首先定位客户端的创建和注册定位监听器,然后设置定位的选项,然后就是启动定位。


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SDKInitializer.initialize(getApplicationContext());
    setContentView(R.layout.activity_main);

    mMapView = (MapView)findViewById(R.id.mapView);
    mMap = mMapView.getMap();

    //注册定位客户端,并且注册定位监听器
    mLocationClient = new LocationClient(this);
    mLocationClient.registerLocationListener(this);

    //创建定位客户端的 选项 ,在这里面设置 定位的类型,CoorType,以及是否打开Gps,间隔事件ScanSpan
    LocationClientOption options = new LocationClientOption();
    options.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);

    options.setCoorType("bd09ll");//latitue longtitute
    options.setOpenGps(true);
    options.setIsNeedAddress(true);
    options.setProdName("xueziqiang");
    options.setScanSpan(5000);

    //将定位的选项 赋值给 定位的客户端,并且 启动
    mLocationClient.setLocOption(options);
    mLocationClient.start();//注意这里 要用到 start而不是mLocationClient.requestLocation()

}

6:然后就是监听器的回调里面设置一个标记,这个标记就是当前位置,并且更新MapView当前的中心为当前的位置

//回调方法,mLocationClient.start的 回调方法,
@Override
public void onReceiveLocation(BDLocation bdLocation) {
    //注意 这个 LatLng,它用与设置 标记的位置和 Map的中心点的位置 。

    LatLng latLng = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());

    MarkerOptions options = new MarkerOptions();
    options.position(latLng);
    options.draggable(true);
    //必须要设置optionicon,而且 这个 icon 必须是BitmapDescriptor的。
    BitmapDescriptor bitmapFactory = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
    options.icon(bitmapFactory);

    mMap.addOverlay(options);

    //设置获取的位置为中心点 。这里面的 参数是 LatLng
    MapStatusUpdate mapStatus = MapStatusUpdateFactory.newLatLng(latLng);
    mMap.setMapStatus(mapStatus);

    Log.d("kodulf","Latitude is"+bdLocation.getLatitude()+" lotitude is"+ bdLocation.getLongitude()+" "+latLng.toString());
}


7:因为之前注册了监听器,那么现在就要取消掉,并且停止,更新onDestory的方法

@Override
protected void onDestroy() {
    super.onDestroy();
    mMapView.onDestroy();
    mLocationClient.unRegisterLocationListener(this);
    //千万别忘了这个stop,如果不stop那么会继续执行
    mLocationClient.stop();
}

8:因为不能够每次服务查询当前位置的时候都创建一个标记,所以将标记变成一个成员变量。

//为了不每次获取当前位置的时候都创建标记,将标记设置为成员变量
private Marker mMarker;

//回调方法,mLocationClient.start的 回调方法,
@Override
public void onReceiveLocation(BDLocation bdLocation) {
    //注意 这个 LatLng,它用与设置 标记的位置和 Map的中心点的位置 。

    LatLng latLng = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());
    if(mMarker==null) {
        MarkerOptions options = new MarkerOptions();
        options.position(latLng);
        options.draggable(true);
        //必须要设置optionicon,而且 这个 icon 必须是BitmapDescriptor的。
        BitmapDescriptor bitmapFactory = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
        options.icon(bitmapFactory);
        //第一次的时候,通过强制类型转换将mMap.addOverlay(options) 变成Marker,因为它返回的其实是Overlay        //OverlayMarker的父类,所以要强制类型转换
        mMarker=(Marker)mMap.addOverlay(options);
    }else{
        mMarker.setPosition(latLng);
    }
    //设置获取的位置为中心点 。这里面的 参数是 LatLng
    MapStatusUpdate mapStatus = MapStatusUpdateFactory.newLatLng(latLng);
    mMap.setMapStatus(mapStatus);

    Log.d("kodulf","Latitude is"+bdLocation.getLatitude()+" lotitude is"+ bdLocation.getLongitude()+" "+latLng.toString());
}

9:为了设置缩放级别:

mMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(newMapStatus.Builder().zoom(15).build()));

  

+++++++++++++++++++++++++++++++++++++
总体的代码在这里:



Logo

前往低代码交流专区

更多推荐