Android基础实战之百度SDK使用 | 带实例

百度SDK

  • 首先从百度地图官网lbs下载需要的功能包,然后将之放进对应的文件夹里
  • 其次,在xml里申请需要用到的权限
  • manifest
<!--申请权限-->
<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_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_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"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

<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">
	    <!--添加meta-data标签,name属性是固定的,value是我们创建时百度生成的-->
        <meta-data
	            android:name="com.baidu.lbsapi.API_KEY"
	            android:value="D1LCt49XRl4w3GlLXvSo8BEzX6VICo7v"/>

	    <activity android:name=".MainActivity">
	            <intent-filter>
	                <action android:name="android.intent.action.MAIN" />

	                <category android:name="android.intent.category.LAUNCHER" />
	            </intent-filter>
	    </activity>

		<!--注册一个LBS SDK服务-->
	    <service android:name="com.baidu.location.f"
	            android:enabled="true"
	            android:process=":remote"/>
</application>
  • activity_main
<TextView
	        android:id="@+id/position_text_view"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:visibility="gone"
	        app:layout_constraintBottom_toBottomOf="parent"
	        app:layout_constraintHorizontal_bias="0.204"
	        app:layout_constraintLeft_toLeftOf="parent"
	        app:layout_constraintRight_toRightOf="parent"
	        app:layout_constraintTop_toTopOf="parent"
	        app:layout_constraintVertical_bias="0.044" />

<com.baidu.mapapi.map.MapView
	        android:id="@+id/bmapView"
	        android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        android:clickable="true"
	        app:layout_constraintBottom_toBottomOf="parent"
	        app:layout_constraintEnd_toEndOf="parent"
	        app:layout_constraintStart_toStartOf="parent"
	        app:layout_constraintTop_toTopOf="parent" />
  • MainActivity
public class MainActivity extends AppCompatActivity {

    // 创建一个LocationClient实例
    public LocationClient mLocationClient;

    private TextView positionText;

    private MapView mMapView;

    // 创建一个地图控制器,为显示所处位置做准备
    private BaiduMap mBaiduMap;
    private boolean isFirstLocate = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 接收一个全局context
        mLocationClient = new LocationClient(getApplicationContext());
        // 注册一个监听器,当获取到位置信息的时候,回调该定位监听器
        mLocationClient.registerLocationListener(new MyLocationListener());
        // 初始化地图
        SDKInitializer.initialize(getApplicationContext());

        setContentView(R.layout.activity_main);

        mMapView = findViewById(R.id.bmapView);

        // 获取BaiduMap实例
        mBaiduMap = mMapView.getMap();

        // 获得权限,使光标显示在地图上
        mBaiduMap.setMyLocationEnabled(true);

        positionText = findViewById(R.id.position_text_view);
        // 创建一个空集合,将需要动态申请的权限,没授权的依次添加进来
        List<String> permissionList = new ArrayList<>();

        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() {
        initLocation();
        // 结果回调到监听器
        mLocationClient.start();
    }

    // 实时更新定位
    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        // 设定每5秒更新一次定位数据
        option.setScanSpan(1000);

        // 设置为百度地图坐标体系,默认gcj02出来的位置误差太大
        //        WGS-84:是国际标准,GPS坐标(Google Earth使用、或者GPS模块)
        //        GCJ-02:中国坐标偏移标准,Google Map、高德、腾讯使用
        //        BD-09:百度坐标偏移标准,Baidu Map使用
        option.setCoorType("bd09ll");

        // 设定强制使用GPS定位
        //option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);

        // 获取当前位置的详细信息
        option.setIsNeedAddress(true);

        mLocationClient.setLocOption(option);
    }

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

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 在活动被摧毁时一定要调用该方法停止定位,否则程序会在后台持续定位,消耗手机电量
        mLocationClient.stop();
        mMapView.onDestroy();
        mBaiduMap.setMyLocationEnabled(false);
    }

    @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();
                }
                break;
            default:
        }
    }

    // 用于获取当前位置,并更新到地图上
    private void navigateTo(BDLocation location) {
        if (isFirstLocate) {
            LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
            MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
            mBaiduMap.animateMapStatus(update);
            // 缩放级别3~19之间,越高越精确
            update = MapStatusUpdateFactory.zoomTo(18f);
            mBaiduMap.animateMapStatus(update);
            isFirstLocate = false;
        }

        // 设置显示我在地图上的光标信息
        MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
        locationBuilder.latitude(location.getLatitude());
        locationBuilder.longitude(location.getLongitude());
        MyLocationData locationData = locationBuilder.build();
        mBaiduMap.setMyLocationData(locationData);

    }

    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation bdLocation) {

            // 用于判断是不是第一次定位
            if (bdLocation.getLocType() == BDLocation.TypeGpsLocation || bdLocation.getLocType() == BDLocation.TypeNetWorkLocation){
                navigateTo(bdLocation);
            }

            StringBuilder currentPosition = new StringBuilder();
            currentPosition.append("纬度: ").append(bdLocation.getLatitude()).append("
");
            currentPosition.append("经度: ").append(bdLocation.getLongitude()).append("
");
            currentPosition.append("国家: ").append(bdLocation.getCountry()).append("
");
            currentPosition.append("省: ").append(bdLocation.getProvince()).append("
");
            currentPosition.append("市: ").append(bdLocation.getCity()).append("
");
            currentPosition.append("区: ").append(bdLocation.getDistrict()).append("
");
            currentPosition.append("街道: ").append(bdLocation.getStreet()).append("
");
            currentPosition.append("定位方式: ");
            if (bdLocation.getLocType() == BDLocation.TypeGpsLocation) {
                currentPosition.append("GPS");
            } else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
                currentPosition.append("网络");
            }

            positionText.setText(currentPosition);

        }
    }
}
  • 下载地址

https://github.com/qricis/DoSomeAndroidTest/tree/main/LBSTest

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值