安卓之百度地图实现位置定位

安卓之实现位置定位

首先需要百度地图提供的SDK,在这里我就不介绍如何申请了,我在上一篇文章介绍了,在这里我就不多说了。
接下来我们要实现精确的定位。话不多说直接上案例:
先把百度地图提供的jar复制到如下所示:
在这里插入图片描述
首先创建一个安卓项目在这里我就不介绍如何创建了。
在xml中编写如下代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

</LinearLayout>

主要是编写一个地图视图。
在java中编写如下代码:


public class MainActivity extends AppCompatActivity {
    private LocationClient locationClient;////定位服务的客户端。宿主程序在客户端声明此类,并调用
    private MapView mapView;
    private BaiduMap baiduMap;
    private boolean isFirstLocate=true;//判断是否是第一次定位

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);                       //LocationClient定位服务的客户端。宿主程序在客户端声明此类,并调用
        locationClient=new LocationClient(getApplicationContext());//调用getApplicationContext()方法来调用一个全局的Context参数并传入
        locationClient.registerLocationListener(new MyLocationListener());
        SDKInitializer.initialize(getApplicationContext());//初始化地图SDK,必须在 setContentView(R.layout.activity_main)之上
        setContentView(R.layout.activity_main);
        mapView=(MapView)findViewById(R.id.bmapView); // 地图初始化
        baiduMap=mapView.getMap(); // 开启定位图层
        baiduMap.setMyLocationEnabled(true);//本人理解是否定位当前位置
        /******下面主要是判断权限问题********/
        List<String> permissionList=new ArrayList<>();//创建空的List集合
        //依次判断下面3个权限有没有被授权,如果没有被授权就添加到List集合中,最后将Lisr转换成数组
        //再调用  ActivityCompat.requestPermissions()方法一次性申请
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (!permissionList.isEmpty()){
            String[] permissions=permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
        }else {
            requestLocation();
        }


    }

    private void requestLocation() {

        locationClient.start();//开始定位,定位的结果会回调到我们前面注册的监听器中MyLocationListener
        //LocationClient的start()方法只会定位一次
        initLocation();
    }

    private void initLocation() {
        LocationClientOption option=new LocationClientOption();// LocationClientOption主要意思是选择定位服务模式的类型
        option.setScanSpan(4000);//设置更新的间隔 多长时间进行一次请求
        option.setIsNeedAddress(true);//是否获取当前详细的地址信息
        //option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//这个是设置定位模式为高精度模式
        //
        locationClient.setLocOption(option);// 使用设置
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case 1:
                if (grantResults.length>0){
                    for (int result:grantResults){
                        if (result!=PackageManager.PERMISSION_GRANTED){
                            Toast.makeText(this,"必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                    requestLocation();
                }else {
                    Toast.makeText(this,"发生未知错误",Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            default:
        }
    }

    public class MyLocationListener implements BDLocationListener{
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {//本人感觉BDLocation封装了许多,比如获取经纬度,地区等
            if (bdLocation.getLocType()==BDLocation.TypeNetWorkLocation||bdLocation.getLocType()==BDLocation.TypeGpsLocation){
                navigateTo(bdLocation);
            }
        }
    }

    private void navigateTo(BDLocation bdLocation) {
        if (isFirstLocate){
            //LatLng是存储经纬度坐标值的类,单位角度。
            LatLng latLng=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());//使用传入的经纬度构造LatLng 对象,一对经纬度值代表地球上一个地点
            //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
            //MapStatusUpdateFactory生成地图状态将要发生的变化
            //newLatLng设置地图新中心点
            MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(latLng);
            baiduMap.animateMapStatus(update);//把update传入animateMapStatus()方法中,就可以将地图移动到指定的经纬度上
            update=MapStatusUpdateFactory.zoomTo(16f);//设置缩放级别
            baiduMap.animateMapStatus(update);
            isFirstLocate=false;
        }
        // MyLocationData.Builder这个类是用来封装设备当前所在位置
        MyLocationData.Builder builder=new MyLocationData.Builder();
        builder.latitude(bdLocation.getLatitude());
        builder.longitude(bdLocation.getLongitude());
        MyLocationData locationData=builder.build();//.build()方法会生成一个 MyLocationData的实例
        //然后在将这个实例传入 baiduMap.setMyLocationData()方法中,就可以让设备当前的位置显示在地图上了
        baiduMap.setMyLocationData(locationData);
    }
    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
       locationClient.stop();//一定要停止定位,不然程序会持续在后天不停地进行定位,严重消耗手机电量
       baiduMap.setMyLocationEnabled(false);
    }

}

(我已经在代码上关于不理解的我已经注释介绍了,在这里我就不介绍了)
最重要的还得在manifest.xml中设置权限问题,还有你所申请的百度密钥。
例如下面我所示:\

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.lbstest4">
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.READ_LOGS"
        tools:ignore="ProtectedPermissions" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data android:name="com.baidu.lbsapi.API_KEY"
            android:value="ADuRoL0gilmwrS6MnskQyWGSaaQxhwaH"/>
        <service android:name="com.baidu.location.f" android:enabled="true"
            android:process=":remote"
            />
    </application>

</manifest>

下面是关于地图的一些要使用的类,我只是列出一部分:
类 MapStatusUpdateFactory
类 com.baidu.mapapi.map.BaiduMap
的使用

类 LocationClientOption
这只是我列出一部分,您可以自行查找。
最终的效果图如下所示:
在这里插入图片描述
(这个图只是我缩小的效果)
好了一个简单定位就完成了。
星光不问赶路人,时光不负有心人。你若“有心”定会闯出属于你的一片天地。

猜你喜欢

转载自blog.csdn.net/jzdcuccess/article/details/106393660