美文网首页
Android百度地图——定位(已封装)

Android百度地图——定位(已封装)

作者: runningboys | 来源:发表于2017-05-04 15:38 被阅读0次

简单按步骤即可实现定位功能:

1.下载百度地图SDK基础定位

将SO文件的压缩文件解压出来,把对应架构下的SO文件放入开发者自己APP的对应架构下的文件夹中(建议全部放入以提高程序兼容性);将JAR文件拷贝到工程的libs目录下,这样即可在程序中使用Android定位SDK。

在build.gradle中配置SO文件的使用,如下所示:

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
}
2.设置AndroidManifest.xml

声明使用权限

<!-- 这个权限用于进行网络定位-->
    <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标签中声明SERVICE组件并添加百度密钥

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

<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="PUNGOv0mnOPLjCl04XAwK4CsbGPOjsa4" /> //key:开发者申请的Key(填写自己申请的key)
3.下面是封装好的百度定位的工具类
/**
 * 百度地图定位工具类
 *
 * @author LiuFeng
 * @date 2017-7-22
 */
public class BdLocationUtil {

    /**
     * 单例
     *
     * @return
     */
    public static BdLocationUtil getInstance() {
        return LocationHolder.INSTANCE;
    }

    private static class LocationHolder {
        private static final BdLocationUtil INSTANCE = new BdLocationUtil();
    }

    private BdLocationUtil() {
    }

    /**
     * 定位回调的接口
     */
    public interface MyLocationListener {
        void myLocation(BDLocation location);
    }

    /**
     * 获取当前位置
     */
    public void requestLocation(final MyLocationListener listener) {
        //声明LocationClient类
        final LocationClient locationClient = new LocationClient(App.getContext());
        // 设置定位条件
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);                // 是否打开GPS
        option.setCoorType("bd09ll");           // 设置返回值的坐标类型
        option.setScanSpan(10000);              // 设置定时定位的时间间隔。单位毫秒
        option.setIsNeedAddress(true);          //可选,设置是否需要地址信息,默认不需要
        option.setIgnoreKillProcess(false);     //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
        locationClient.setLocOption(option);
        // 注册位置监听器
        locationClient.registerLocationListener(new BDAbstractLocationListener() {
            @Override
            public void onReceiveLocation(BDLocation location) {
                listener.myLocation(location);
                locationClient.stop();
            }
        });
        locationClient.start();
        /*
         * 当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。调用requestLocation(
         * )后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,
         * 返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。
         * 定时定位时,调用一次requestLocation,会定时监听到定位结果。
         */
        locationClient.requestLocation();
    }
}

4.将以下代码放入需要定位的Activity中,在onCreate()方法中调用myPermissionRequest()方法即可,以上工作准备好就可以使用啦
/**
     * 动态请求权限,安卓手机版本在5.0以上时需要
     */
    private void myPermissionRequest() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查是否拥有权限,申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)
            if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[] {
                    Manifest.permission.ACCESS_COARSE_LOCATION
                }, BAIDU_ACCESS_COARSE_LOCATION);
            }
            else {
                // 已拥有权限,作相应处理(调用定位SDK应当确保相关权限均被授权,否则可能引起定位失败)
                myLocation();
            }
        }else {
            // 安卓手机版本在5.0时,配置清单中已申明权限,作相应处理,此处正对sdk版本低于23的手机
            myLocation();
        }
    }

    /**
     * 百度地图定位的请求方法   拿到 国 省 市  区
     */
    private void myLocation() {
        BdLocationUtil.getInstance().requestLocation(new BdLocationUtil.MyLocationListener() {
            @Override
            public void myLocation(BDLocation location) {
                if (location == null) {
                    return;
                }
                if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
                    String mCounty = location.getCountry();        //获取国家
                    String mProvince = location.getProvince();     //获取省份
                    String mCity = location.getCity();             //获取城市
                    String mDistrict = location.getDistrict();     //获取区
                    Log.i("==requestLocation===", "myLocation: "+mCounty+"="+mProvince+"="+mCity+"="+mDistrict);
                }
            }
        });
    }

    /**
     * 权限请求的返回结果
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            // requestCode即所声明的权限获取码,在checkSelfPermission时传入
            case BAIDU_ACCESS_COARSE_LOCATION:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 第一次获取到权限,请求定位
                    myLocation();
                }
                else {
                    // 没有获取到权限,做特殊处理
                    Log.i("=========", "请求权限失败");
                }
                break;

            default:
                break;
        }
    }

是不是特别简单啊,完成啦啦啦···

源码下载,请点击这里

相关文章

网友评论

      本文标题:Android百度地图——定位(已封装)

      本文链接:https://www.haomeiwen.com/subject/qpprtxtx.html