zoukankan      html  css  js  c++  java
  • Android使用百度地图定位

    下面事例是使用Android平台的部分代码。对于这个平台百度的开放人员已经写了完整的demo,把工程导入到eclipse中之后一般没有错误,如果报错的话,eclipse也会给出提示。一般可以通过将propertie.properties文件名字改为default.properties就 可以了,如果还有错误的话,显示工程activity错误啊什么的,就是SDK版本不对的问题了,你可以通过他的manifest文件查 看<uses-sdk android:minSdkVersion="8" />找到这个最小值,比如我下载的是2.6他的最低版本是5,我eclipse默认版本是8,就可以同过右键单击该工程,选择最下面那个properties项,然后在弹出对话框的右侧列表中选择Android,在左侧选择API level为5,也就是2.0,然后确定。就木有问题了。

    下面说一下使用该API的具体步骤:

    也可以查看百度定位SDK自己的开发指南

    1、首先第一步就是搭配环境:

    ①先将百度demo中的libs文件夹复制到自己的工程。(别忘记把jar包build path)

    ②然后复制

    1. <service android:name="com.baidu.location.f" android:enabled="true" 
    2. android:process=":remote" android:permission="android.permission.BAIDU_LOCATION_SERVICE"
    3.     <intent-filter
    4.           <action android:name="com.baidu.location.service_v2.6"></action
    5.     </intent-filter
    6. </service

    到manifest的application节点。

    接下来复制百度地位SDK需要的permission

    1.        <permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></permission
    2. <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"
    3.        </uses-permission
    4. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
    5.        </uses-permission
    6. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
    7.        </uses-permission
    8. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"
    9.        </uses-permission
    10. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
    11.        </uses-permission
    12. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"
    13.        </uses-permission
    14. <uses-permission android:name="android.permission.READ_PHONE_STATE"
    15.        </uses-permission
    16. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    17.        </uses-permission
    18. <uses-permission android:name="android.permission.INTERNET" /> 
    19. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    20.        </uses-permission
    21. <uses-permission android:name="android.permission.READ_LOGS"></uses-permission

    ③ 接下来就可以在代码中放心的使用百度定位SDK了。

    下面是来自百度的提醒,需要注意的是第五条,因为我们第一次经常定位不到位置:

    1、您需要确保程序编译通过。如果对自己写的代码有疑问,可以下载官方高级示例,查看标准源代码。

    2、请确保网络通畅,无论是连接wifi还是使用2G/3G信号。

    3、定位SDK的调用必须在主线程中。

    4、必须在定位SDK启动前设定好参数,例如是否使用GPS,扫描时间间隔设置等。我们强烈建议您设置自己的prodName,并保管好,这样方便我们为您提供更好的定位服务。

    5、定位SDK start之后立即执行,这种情况下很难定位成功,因为定位SDK刚开始启动还没有获取到定位信息。这时getlocation一般为null。如果是要获取位置成功,可以在listerner中添加一个判断如果strData为空,则再发起一次定位。

    6、定位覆盖率大概在98%。就是说有2%可能服务器没有数据,所以定位会失败。只需要走到别的地方,或者多试几次即可成功定位。

    7、请使用真机。在虚拟机上无法进行定位测试。

    下面就是我的事例代码:

    具体思路是:将开启和获取位置的代码分开来做,可以在程序刚开启的时候就start。因为据上面所说,有时候可能两分钟才能获取到位置,对于我们需要展示信息来说,这是绝对不可以的。如果在主线程卡两分钟后果可想而知的。

    需要说名的是:我这里没有设置时间间隔public void setScanSpan ( int ) //设置定时定位的时间间隔。单位ms,如果不设置或者所设置的整数值小于1000(ms)时,采用第一次定位模式。

    每调用一次requestLocatin(),定位SDK会发起一次定位。请求定位与监听结果一一对应;如果所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。

    调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。

    定时定位时,调用一次requestLocation,会定时监听到定位结果。设定了定时定位后,可以热切换成一次定位,需要重新设置时间间隔小于1000(ms)即可。locationClient对象stop后,将不再进行定位。 如果设定了定时定位模式后,多次调用requestLocation(),则是每隔一段时间进行一次定位,同时额外的定位请求也会进行定位,但频率不会超过1秒一次。

    1. import android.content.Context; 
    2.  
    3. import com.baidu.location.BDLocation; 
    4. import com.baidu.location.BDLocationListener; 
    5. import com.baidu.location.LocationClient; 
    6. import com.baidu.location.LocationClientOption; 
    7. import com.palmdeal.entity.LocationInfo.SItude; 
    8. import com.palmdeal.util.Logger; 
    9.  
    10. public class LocationProvider { 
    11.     private static LocationClient mLocationClient = null; 
    12.  
    13.     private static SItude station = new SItude(); 
    14.     private static MyBDListener listener = new MyBDListener(); 
    15.  
    16.     Context context; 
    17.  
    18.     public LocationProvider(Context context) { 
    19.         super(); 
    20.         this.context = context; 
    21.     } 
    22.  
    23.     public void startLocation() { 
    24.         mLocationClient = new LocationClient(context); 
    25.         LocationClientOption option = new LocationClientOption(); 
    26.         option.setOpenGps(true); // 打开gps 
    27.         option.setCoorType("bd09ll"); // 设置坐标类型为bd09ll 
    28.         option.setPriority(LocationClientOption.NetWorkFirst); // 设置网络优先 
    29.         option.setProdName("demo"); // 设置产品线名称 
    30.         mLocationClient.setLocOption(option); 
    31.         mLocationClient.registerLocationListener(listener); 
    32.         mLocationClient.start();//将开启与获取位置分开,就可以尽量的在后面的使用中获取到位置 
    33.     } 
    34.  
    35.     /** 
    36.      * 停止,减少资源消耗 
    37.      */ 
    38.     public void stopListener() { 
    39.         if (mLocationClient != null && mLocationClient.isStarted()) { 
    40.             mLocationClient.stop(); 
    41.             mLocationClient = null; 
    42.         } 
    43.     } 
    44.  
    45.     /** 
    46.      * 更新位置并保存到SItude中 
    47.      */ 
    48.     public void updateListener() { 
    49.         if (mLocationClient != null && mLocationClient.isStarted()) { 
    50.             mLocationClient.requestLocation(); 
    51.             Logger.i("update the location"); 
    52.         } 
    53.     } 
    54.  
    55.     /** 
    56.      * 获取经纬度信息 
    57.      *  
    58.      * @return 
    59.      */ 
    60.     public SItude getLocation() { 
    61.         return station; 
    62.     } 
    63.  
    64.     private static class MyBDListener implements BDLocationListener { 
    65.  
    66.         @Override 
    67.         public void onReceiveLocation(BDLocation location) { 
    68.             if (location.getCity() == null) { 
    69.                 int type = mLocationClient.requestLocation(); 
    70.                 Logger.e("first request false" + type); 
    71.             } 
    72.             station.latitude = location.getLatitude(); 
    73.             station.longitude = location.getLongitude(); 
    74.         } 
    75.  
    76.         @Override 
    77.         public void onReceivePoi(BDLocation arg0) { 
    78.             // return 
    79.         } 
    80.  
    81.     } 

    在使用的时候,在一开始就开启LocationClient,即调用startLocation()方法。我的是在服务服务中的onCreate中调用的,然后在代码中这样使用:

    1. LocationInfo.SItude station = location.getLocation(); 
    2. if (station.latitude == 0.0 && station.longitude == 0.0) { 
    3.       location.updateListener(); 
    4.       station = location.getLocation(); 
    5. if (station.latitude == 0.0 && station.longitude == 0.0) { 
    6.        return "未定位到您现在的位置,请重试"; 
    7. location.stopListener(); 

    使用上面的方法后,第一次使用都能拿到位置信息。

    http://mobile.51cto.com/aprogram-376690.htm

  • 相关阅读:
    hdu 2665 划分树
    概率模型与条件随机场
    shell中各种括号的作用()、(())、[]、[[]]、{}
    今日BBC
    小贝_mysql主从复制作用以及案例
    c++ builder 版CreateAnonymousThread用法
    安卓UI适配限定符
    编译3.10内核 出现错误 “undefined reference to....&quot; 解决方法
    iptables的4表5链(未完)
    已有iptables表的查看
  • 原文地址:https://www.cnblogs.com/daishuguang/p/3877995.html
Copyright © 2011-2022 走看看