zoukankan      html  css  js  c++  java
  • 百度Android定位SDK4.2

    项目最近要把定位服务独立出来,所以顺便把定位服务升级到4.2最新版。以下记录一个简单的定位服务的实现(基于百度Android定位4.2版本)
    1:首先到百度LBS平台申请密钥
    申请密钥需要安全码:你的Eclipse SHA1指纹(Preferences->Android->Build)+分号+应用程序包名
    例如:
    FS:54:EB:47:23:F6:70:FD:DD:GF:53:FS:10:1F:1A:54:00:5E:C0:24;com.example.testandroid
    2:下载并添加百度定位的jar、so文件
    locSDK_4.2.jar添加到libs包下,另外,libs目录下新建目录armeabi,并把liblocSDK4d.so文件复制其中
    3:配置AndroidManifest.xml文件

    声明使用权限

     1 <!-- 这个权限用于进行网络定位-->
     2 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
     3 <!-- 这个权限用于访问GPS定位-->
     4 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
     5 <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
     6 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
     7 <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
     8 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
     9 <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    10 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    11 <!-- 用于读取手机当前的状态-->
    12 <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    13 <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    14 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    15 <!-- 访问网络,网络定位需要上网-->
    16 <uses-permission android:name="android.permission.INTERNET" />
    17 <!—SD卡读取权限,用户写入离线定位数据-->
    18 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
    19 <!--允许应用读取低级别的系统日志文件 -->
    20 <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

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

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

    设置AcessKey

    1 <meta-data
    2             android:name="com.baidu.lbsapi.API_KEY"
    3             android:value="key" />//key:开发者申请的key

    例如,我的AndroidManifest.xml文件如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.testandroid"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6 
     7     <uses-sdk
     8         android:minSdkVersion="8"
     9         android:targetSdkVersion="19" />
    10 
    11     <!-- 这个权限用于进行网络定位 -->
    12     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    13     </uses-permission>
    14     <!-- 这个权限用于访问GPS定位 -->
    15     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    16     </uses-permission>
    17     <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    18     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    19     </uses-permission>
    20     <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
    21     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    22     </uses-permission>
    23     <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    24     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    25     </uses-permission>
    26     <!-- 用于读取手机当前的状态 -->
    27     <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    28     </uses-permission>
    29     <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
    30     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    31     </uses-permission>
    32     <!-- 访问网络,网络定位需要上网 -->
    33     <uses-permission android:name="android.permission.INTERNET" />
    34     <!-- SD卡读取权限,用户写入离线定位数据 -->
    35     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
    36     </uses-permission>
    37     <!-- 允许应用读取低级别的系统日志文件 -->
    38     <uses-permission android:name="android.permission.READ_LOGS" >
    39     </uses-permission>
    40 
    41     <application
    42         android:allowBackup="true"
    43         android:icon="@drawable/ic_launcher"
    44         android:label="@string/app_name"
    45         android:theme="@style/AppTheme" >
    46         <activity
    47             android:name="com.example.testandroid.ui.LocationActivity"
    48             android:label="@string/app_name" >
    49             <intent-filter>
    50                 <action android:name="android.intent.action.MAIN" />
    51 
    52                 <category android:name="android.intent.category.LAUNCHER" />
    53             </intent-filter>
    54         </activity>
    55 
    56         <service
    57             android:name="com.baidu.location.f"
    58             android:enabled="true"
    59             android:process=":remote" >
    60             <intent-filter>
    61                 <action android:name="com.baidu.location.service_v2.2" >
    62                 </action>
    63             </intent-filter>
    64         </service>
    65         <!-- meta-data需要写在application中 -->
    66         <meta-data
    67             android:name="com.baidu.lbsapi.API_KEY"
    68             android:value="your key" /><!-- 这里的Key需要改成你申请的Key -->
    69     </application>
    70 
    71 </manifest>

    测试应用中,只有一个Activity:

      1 package com.example.testandroid.ui;
      2 
      3 import android.os.Bundle;
      4 import android.support.v7.app.ActionBarActivity;
      5 import android.view.View;
      6 import android.widget.Button;
      7 import android.widget.TextView;
      8 
      9 import com.baidu.location.BDLocation;
     10 import com.baidu.location.BDLocationListener;
     11 import com.baidu.location.LocationClient;
     12 import com.baidu.location.LocationClientOption;
     13 import com.baidu.location.LocationClientOption.LocationMode;
     14 import com.example.testandroid.R;
     15 
     16 public class LocationActivity extends ActionBarActivity {
     17 
     18     private TextView location_tv1;
     19     private Button startLocation;
     20     private boolean isStart = false;
     21     public LocationClient mLocationClient;
     22     public MyLocationListener mMyLocationListener;
     23     private long times = 0;
     24 
     25     @Override
     26     protected void onCreate(Bundle savedInstanceState) {
     27         super.onCreate(savedInstanceState);
     28         setContentView(R.layout.activity_location);
     29         initView();
     30         init();
     31     }
     32 
     33     private void initView() {
     34         location_tv1 = (TextView) findViewById(R.id.location_tv1);
     35         startLocation = (Button) findViewById(R.id.startLocation);
     36         startLocation.setOnClickListener(new View.OnClickListener() {
     37 
     38             @Override
     39             public void onClick(View v) {
     40                 ctlLocService();
     41             }
     42         });
     43     }
     44 
     45     /**
     46      * 
     47      * @Title: init 
     48      * @Description: 初始化相关服务及监听
     49      * @return void
     50      * @throws 
     51      * @author creasylai19@gmail.com
     52      */
     53     private void init() {
     54         mLocationClient = new LocationClient(this.getApplicationContext());
     55         mMyLocationListener = new MyLocationListener();
     56         mLocationClient.registerLocationListener(mMyLocationListener);
     57         InitLocation();
     58     }
     59 
     60     /**
     61      * 
     62      * @Title: ctlLocService 
     63      * @Description: 控制定位服务的开关
     64      * @return void
     65      * @throws 
     66      * @author creasylai19@gmail.com
     67      */
     68     private void ctlLocService() {
     69         if (!isStart) {
     70             isStart = true;
     71             mLocationClient.start();
     72             startLocation.setText("停止定位");
     73         } else {
     74             isStart = false;
     75             mLocationClient.stop();
     76             startLocation.setText("启动定位");
     77         }
     78     }
     79 
     80     private void InitLocation() {
     81         LocationClientOption option = new LocationClientOption();
     82         option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
     83         /**
     84          * 返回国测局经纬度坐标系 coor=gcj02
     85          * 返回百度墨卡托坐标系 coor=bd09
     86          * 返回百度经纬度坐标系 coor=bd09ll
     87          */
     88         option.setCoorType("bd09ll");// 百度手机地图对外接口中的坐标系默认是bd09ll,如果配合百度地图产品的话,需要注意坐标系对应问题
     89         /**
     90          * 当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。调用requestLocation()
     91          * 后,每隔设定的时间,定位SDK就会进行一次定位。
     92          * 如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,返回上一次定位的结果;
     93          * 如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。定时定位时,调用一次requestLocation,会定时监听到定位结果。
     94          * 
     95          * 当不设此项,或者所设的整数值小于1000(ms)时,采用一次定位模式。每调用一次requestLocation(),
     96          * 定位SDK会发起一次定位。请求定位与监听结果一一对应。
     97          * 
     98          * 设定了定时定位后,可以热切换成一次定位,需要重新设置时间间隔小于1000(ms)即可。locationClient对象stop后,将不再进行定位
     99          * 。 如果设定了定时定位模式后,多次调用requestLocation(),则是每隔一段时间进行一次定位,同时额外的定位请求也会进行定位,
    100          * 但频率不会超过1秒一次。
    101          */
    102         option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
    103         option.setIsNeedAddress(true); // 返回的定位结果包含地址信息
    104         option.setNeedDeviceDirect(true); // 返回的定位结果包含手机机头的方向
    105         option.setOpenGps(true); // 打开GPS
    106         // String 值为all时,表示返回地址信息,其他值都表示不返回地址信息(官方指南说有这个方法,但类中却没有,不知道为什么)
    107         // option.setAddrType("all");
    108         option.setProdName("com.example.textandroid"); // 设置产品线名称,百度建议
    109         mLocationClient.setLocOption(option);
    110     }
    111 
    112     protected void onStop() {
    113         mLocationClient.stop();
    114         super.onStop();
    115     }
    116 
    117     public class MyLocationListener implements BDLocationListener {
    118 
    119         @Override
    120         public void onReceiveLocation(BDLocation location) {
    121             StringBuffer sb = new StringBuffer(256);
    122             sb.append("第" + (++times) + "获取定位");
    123             sb.append("
    time : ");
    124             sb.append(location.getTime());
    125             sb.append("
    error code : ");
    126             sb.append(location.getLocType());
    127             sb.append("
    latitude : ");
    128             sb.append(location.getLatitude());
    129             sb.append("
    lontitude : ");
    130             sb.append(location.getLongitude());
    131             sb.append("
    radius : ");
    132             sb.append(location.getRadius());
    133             if (location.getLocType() == BDLocation.TypeGpsLocation) {
    134                 sb.append("
    speed : ");
    135                 sb.append(location.getSpeed());
    136                 sb.append("
    satellite : ");
    137                 sb.append(location.getSatelliteNumber());
    138                 sb.append("
    direction : ");
    139                 sb.append("
    addr : ");
    140                 sb.append(location.getAddrStr());
    141                 sb.append(location.getDirection());
    142             } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
    143                 sb.append("
    addr : ");
    144                 sb.append(location.getAddrStr());
    145                 // 运营商信息
    146                 sb.append("
    operationers : ");
    147                 sb.append(location.getOperators());
    148             }
    149             location_tv1.setText(sb.toString());
    150         }
    151 
    152     }
    153 }

    相应的layout文件如下:

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:paddingLeft="@dimen/activity_horizontal_margin"
     6     android:paddingRight="@dimen/activity_horizontal_margin"
     7     tools:context="com.example.testandroid.ui.LocationActivity"
     8     android:orientation="vertical" >
     9 
    10     <TextView
    11         android:id="@+id/location_tv1"
    12         android:layout_width="match_parent"
    13         android:layout_height="0dp"
    14         android:layout_weight="1"
    15         android:text="@string/hello_world" />
    16 
    17     <Button
    18         android:id="@+id/startLocation"
    19         android:layout_width="match_parent"
    20         android:layout_height="wrap_content"
    21         android:layout_gravity="bottom"
    22         android:text="启动定位" />
    23 
    24 </LinearLayout>

    运行应用,得到的运行结果的一个截屏如下:

    其实,这些调用第三方接口,参考指南直接看官方文档最好,百度定位的官网指南(不过这个指南有不少错误的,有些指导还是以前老版本的,没有做好更新):
  • 相关阅读:
    curl 命令行使用参考
    PHP 输出json_encode 空白的检查
    RAM和ROM
    浮点数
    负数补码
    位运算
    无法加载文件 C:UsershuangshiminAppDataRoaming pmwechat-terminal.ps1,因为在此系统上禁止运行脚本
    windows + php + shell_exec 执行失败的可能原因
    Ubuntu 发送邮件
    红黑树
  • 原文地址:https://www.cnblogs.com/creasylai19/p/3913910.html
Copyright © 2011-2022 走看看