Android口袋天气系列二-->百度定位

效果图:



添加百度定位功能:

          1. 申请密钥,获取数字签名和包名
                    数字签名:
                         a.Generate Signed apk---->生成一个jks文件
                         b.在terminal里面输入: keytool -list -v -keystore D:\AndroidEmulator\zhanghao.jks
                         c.输入秘钥库口令 z361224g
                   包名:
                         到AndroidManifest.xml中找

          2.导入SDK
                 1.  在libs导入BaiduLBS_Android.jar, 在Project Structure中add
                  2. 在src/main 中新建jniLibs文件夹,将armeabi---liblocSDK6a.so放入jniLibs文件夹

          3.配置AndroidManifest.xml
                    a.在application里面声明Service组件
                    b.声明使用权限
                    c.设置AccesssKey
          
         4.实现定位功能:
                    a.初始化LocationClient类
                    b.配置定位SDK参数
                    c.实现BDLocationListener接口
                    d.开始定位:mLocationClient.start()
                    e.在定位结束时调用  :mLocationClient.stop()



代码:


1.添加权限

     
<!-- 这个权限用于进行网络定位-->
<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
   
android :allowBackup= "true"
   
android :icon= "@mipmap/icon"
   
android :label= "@string/app_name"
   
android :supportsRtl= "true"
   
android :theme= "@style/AppTheme" >
    <activity
android :name= ".UI.MainActivity" >
        <intent-filter>
            <action
android :name= "android.intent.action.MAIN" />

            <category
android :name= "android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
   
<!--百度地图定位Service-->
   
<service android :name= "com.baidu.location.f" android :enabled= "true" android :process= ":remote" >
    </service>
   
<!--百度地图定位Access-Key-->
   
<meta-data
       
android :name= "com.baidu.lbsapi.API_KEY"
       
android :value= "FF:DB:0B:4B:87:97:A7:B4:02:6D:57:CF:D9:D5:54:E3:E9:D2:02:EC;com.zhanghao.pocketweather" />
</application>
        


        2.实现代码

**
* 主页面,Weather
* Created by Administrator on 2016/5/5.
*/
public class WeatherFragment extends Fragment {
   
private View weatherView ;
   
//百度地图定位
   
public LocationClient mLocationClient = null;
    public
BDLocationListener myListener = new MyLocationListener() ;

   
//获取数据的url
   
private static final String urL = "http://apis.haoservice.com/weather/geo?lon=" ;
    private
String currentUrl ;

   
@Nullable
    @Override
   
public View onCreateView (LayoutInflater inflater , @Nullable ViewGroup container , @Nullable Bundle savedInstanceState) {
       
weatherView =inflater.inflate(R.layout. fragment_weather , container ,false ) ;

       
mLocationClient = new LocationClient(getActivity()) ;     //声明LocationClient类
       
mLocationClient .registerLocationListener( myListener ) ;    //注册监听函数
       
initLocation() ;
       
mLocationClient .start() ;

        return
weatherView ;
   
}

   
@Override
   
public void onResume () {
       
super .onResume() ;
   
}
   
/**
     * 配置定位SDK参数
     */
   
private void initLocation (){
        LocationClientOption option =
new LocationClientOption() ;
       
option.setLocationMode(LocationClientOption.LocationMode. Hight_Accuracy
       
) ; //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
       
option.setCoorType( "bd09ll" ) ; //可选,默认gcj02,设置返回的定位结果坐标系
       
int span= 1000 ;
       
option.setScanSpan(span) ; //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
       
option.setIsNeedAddress( true ) ; //可选,设置是否需要地址信息,默认不需要
       
option.setOpenGps( true ) ; //可选,默认false,设置是否使用gps
       
option.setLocationNotify( true ) ; //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
       
option.setIsNeedLocationDescribe( true ) ; //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
       
option.setIsNeedLocationPoiList( true ) ; //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
       
option.setIgnoreKillProcess( false ) ; //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
       
option.SetIgnoreCacheException( false ) ; //可选,默认false,设置是否收集CRASH信息,默认收集
       
option.setEnableSimulateGps( false ) ; //可选,默认false,设置是否需要过滤gps仿真结果,默认需要
       
mLocationClient .setLocOption(option) ;
   
}
   
/**
     * 百度定位监听接口 BDLocationListener
     */
   
public class MyLocationListener implements BDLocationListener {

       
@Override
       
public void onReceiveLocation (BDLocation location) {
           
//Receive Location
           
StringBuffer sb = new StringBuffer( 256 ) ;
           
sb.append( "time : " ) ;
           
sb.append(location.getTime()) ;
           
sb.append( " \n error code : " ) ;
           
sb.append(location.getLocType()) ;
           
sb.append( " \n latitude : " ) ;
           
sb.append(location.getLatitude()) ;
           
sb.append( " \n lontitude : " ) ;
           
sb.append(location.getLongitude()) ;
           
sb.append( " \n radius : " ) ;
           
sb.append(location.getRadius()) ;
            if
(location.getLocType() == BDLocation. TypeGpsLocation ) { // GPS定位结果
               
sb.append( " \n speed : " ) ;
               
sb.append(location.getSpeed()) ; // 单位:公里每小时
               
sb.append( " \n satellite : " ) ;
               
sb.append(location.getSatelliteNumber()) ;
               
sb.append( " \n height : " ) ;
               
sb.append(location.getAltitude()) ; // 单位:米
               
sb.append( " \n direction : " ) ;
               
sb.append(location.getDirection()) ; // 单位度
               
sb.append( " \n addr : " ) ;
               
sb.append(location.getAddrStr()) ;
               
sb.append( " \n describe : " ) ;
               
sb.append( "gps定位成功" ) ;

           
} else if (location.getLocType() == BDLocation. TypeNetWorkLocation ) { // 网络定位结果
               
sb.append( " \n addr : " ) ;
               
sb.append(location.getAddrStr()) ;
               
//运营商信息
               
sb.append( " \n operationers : " ) ;
               
sb.append(location.getOperators()) ;
               
sb.append( " \n describe : " ) ;
               
sb.append( "网络定位成功" ) ;
           
} else if (location.getLocType() == BDLocation. TypeOffLineLocation ) { // 离线定位结果
               
sb.append( " \n describe : " ) ;
               
sb.append( "离线定位成功,离线定位结果也是有效的" ) ;
           
} else if (location.getLocType() == BDLocation. TypeServerError ) {
                sb.append(
" \n describe : " ) ;
               
sb.append( "服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因" ) ;
           
} else if (location.getLocType() == BDLocation. TypeNetWorkException ) {
                sb.append(
" \n describe : " ) ;
               
sb.append( "网络不同导致定位失败,请检查网络是否通畅" ) ;
           
} else if (location.getLocType() == BDLocation. TypeCriteriaException ) {
                sb.append(
" \n describe : " ) ;
               
sb.append( "无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机" ) ;
           
}
            sb.append(
" \n locationdescribe : " ) ;
           
sb.append(location.getLocationDescribe()) ; // 位置语义化信息
           
List<Poi> list = location.getPoiList() ; // POI数据
           
if (list != null ) {
                sb.append(
" \n poilist size = : " ) ;
               
sb.append(list.size()) ;
                for
(Poi p : list) {
                    sb.append(
" \n poi= : " ) ;
                   
sb.append(p.getId() + " " + p.getName() + " " + p.getRank()) ;
               
}
            }
           
if (location.getLocType()== 61 ||location.getLocType()== 161 ||location.getLocType()== 66 )
            {
               
//定位成功
               
Log.i( "info" , sb+ "" ) ;
               
currentUrl = urL +location.getLongitude()+ "&lat=" +location.getLatitude()+ "&key=898d29f0c1d54373a030b09704323cea" ;
                new
WeatherAsyncTask().execute( currentUrl ) ;
               
currentUrl = "" ;
           
}
           
else
           
{
               
//定位失败
           
}
           
mLocationClient .stop() ;
       
}
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值