zoukankan      html  css  js  c++  java
  • Android之百度定位API使用

    API版本:

    百度定位API:V5.0(http://developer.baidu.com/map/wiki/index.php?title=android-locsdk/guide/v5-0)

    百度Geocoding API:V2.0(http://developer.baidu.com/map/index.php?title=webapi/guide/webservice-geocoding)

    使用方法:

    1) 申请KEY(http://lbsyun.baidu.com/apiconsole/key?application=key

    创建一个新的应用(注意应用类别是Android SDK),创建完成后,可以获取到一个“访问应用(AK)”的数值。

    2) 设置AndroidManifest.xml

    在application标签中声明service组件,每个app拥有自己单独的定位service

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

    声明使用权限

    <!-- 这个权限用于进行网络定位-->
    <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>
    <!--允许应用读取低级别的系统日志文件 -->
    <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

    在application标签设置AcessKey

    <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="前面申请的访问应用(AK)" />

    3) 在Activity或者Fragment里面使用API(未列完整代码,只列出了关键实现部分,这里以在Fragment中举例)

    声明成员变量

    public LocationClient mLocClient;
    public MyLocationListener mMyLocationListener;

    初始化成员变量

    @Override
    public void onCreate(Bundle arg0) {
        // TODO Auto-generated method stub
        super.onCreate(arg0);
            
        mLocClient = new LocationClient(getActivity());
        mMyLocationListener = new MyLocationListener();
            
        // 百度定位初始化
        InitLocation();
            
        // 获取位置信息
        startRequestLocation();
    }

    实现回调监听

        /**
         * 实现实位回调监听
         */
        public class MyLocationListener implements BDLocationListener {
    
            @Override
            public void onReceiveLocation(BDLocation location) {// 坐标信息换算成具体位置信息(JSON格式,需要解析)
                List<NameValuePair> list = new ArrayList<NameValuePair>();
                BasicNameValuePair akValuePair = new BasicNameValuePair("ak", "这里填你的AK");
                BasicNameValuePair mcodeValuePair = new BasicNameValuePair("mcode", "这里填你的mcode");
                BasicNameValuePair locationValuePair = new BasicNameValuePair("location", "32.214283,118.893443");
                BasicNameValuePair outputValuePair = new BasicNameValuePair("output", "json");
                BasicNameValuePair poisValuePair = new BasicNameValuePair("pois", "0");
                list.add(akValuePair);
                list.add(mcodeValuePair);
                list.add(locationValuePair);
                list.add(outputValuePair);
                list.add(poisValuePair);
                geoDecoder(list);
                
                // 输出到LOG
                if(D) Log.i(TAG, sb.toString());
                
                // 结束位置信息获取
                if (mLocClient != null) {
                    mLocClient.unRegisterLocationListener(mMyLocationListener);
                    mLocClient.stop();
                }
            }
        }  

    在线程中调用百度Geocoding API V2.0解析出定位信息对应的地址信息,并放到Handler中进行处理

      // 坐标信息换算成具体位置信息(放到线程中去完成,不影响主线程)
        private void geoDecoder(final List<NameValuePair> list) {
            new Thread() {
                public void run() {
                    String url = "http://api.map.baidu.com/geocoder/v2/";
                    String result = HttpUtil.httpPostClient(url, list);
    
                    Message msg = new Message();
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                };
            }.start();
        }
        
        // 主线程里处理其他线程结果数据
        private Handler mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                try {        
                    GeocoderSearchResponse geocoderSearchResponse = new Gson().fromJson(msg.obj.toString(), GeocoderSearchResponse.class);// 输出到控件
                    if(geocoderSearchResponse.status.equals("0")){
                        text_index_location = (TextView) getActivity().findViewById(R.id.text_index_location);
                        text_index_location.setText(geocoderSearchResponse.result.addressComponent.city + geocoderSearchResponse.result.addressComponent.district);
                    }else{
                        text_index_location = (TextView) getActivity().findViewById(R.id.text_index_location);
                        text_index_location.setText("GPS位置获取失败!ErrCode:" + geocoderSearchResponse.status);
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }
            };
        };

    *注意:

    1) 使用百度Geocoding API V2.0进行httpClient POST方式请求数据时,需要加一个mcode参数,形如

        “XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX;com.XXX.YYY”(就是

        申请AK时候填写的安全码)

    2) 地址信息的JSON解析时,内部类的参数构成和文档内容不太一致(可能是百度经常会改动类的内容),所以需要

        根据实际返回的JSON格式内容去组织类

    3) 新开发一个APP时,需要在百度LBS开放平台申请一个新的应用以分配一个新的访问应用(AK)安全码

        其中访问应用(AK)是放到AndroidManifest.xml中的(上文有提到),安全码是放到相关的百度httpClient POST

        方式服务或者百度SDK后台运行时用到的,所以记得app的package名称和你填的安全码的package名称是一致的,

        否则可能会报“Authentication Error errorcode: 230 uid: -1 appid -1 msg: APP Scode码校验失败”这种错误。

        安全码如何获取传送门:http://developer.baidu.com/map/wiki/index.php?title=android-locsdk/guide/key

  • 相关阅读:
    mysql 查询当天、本周,本月,上一个月的数据
    Mysql 查看连接数,状态 最大并发数,以及设置连接数
    MySQL慢查询日志优化
    java中线程通信(传统的线程通信)
    java中死锁
    同步锁(lock)
    同步锁(lock)
    释放同步监视器的锁定(java疯狂讲义)
    linux第9天 UDP
    linux第8天 connect强化
  • 原文地址:https://www.cnblogs.com/jayhust/p/4268440.html
Copyright © 2011-2022 走看看