准备阶段:
1.用Android Studio创建一个项目
 2.在命令符下获取SHA1值(申请秘钥用) 
 3. 在百度地图官网注册开发者账号获取秘钥
 4.记录下获取秘钥成功后的AK值(项目配置文件中使用)
 5.下载需要使用的SDK(根据项目所需功能来勾选下载)
 6.选取SDK中的jar文件和so文件(jia文件放在项目的libs文件加下,so文件放在项目的jniLibs文件下)
 说明:Android Studio项目不会默认创建jniLibs文件夹,有时也不默认创建libs文件夹 在此说明创建
 libs文件夹和jniLibs文件夹的步骤:(1)创建libs文件夹步骤:将项目切换到Project路径下,与app同级
下创建libs文件。(2) 创建jniLibs文件夹步骤:将项目切换至Project路径下在src下的main文件下创建jniLibs
文件夹,此时再将项目切换至android路径下就会看到jniLibs文件夹(但此时不会看见libs文件夹,不影响jar
文件的使用)。
7.jar文件只需在Project路径下拷贝到libs文件中(需要右键点击Add As Library来会自动生成相关的一些文件),但是so文件及所在文件夹需要在Project路径下拷贝到jniLibs文件下也需要

在android路径下拷贝到jniLibs文件夹下,注意点:此时看下jniLibs下是否有armeabi文件夹,如果没有手动创建
然把所有的so文件复制一遍拷贝到armeabi文件夹 
配置文件阶段:
1.首先配置Gradle Scripts文件,点开build.gradle(Module:app)在android{ }中添加:

sourceSets {
 main {
 jniLibs.srcDirs = ['libs']
 }

}


2.在清单文件中配置

  首先添加权限:

 

然后再注册一个固定的服务(固定写法):

<!-- 百度地图定位权限--><!-- 这个权限用于进行网络定位-->
 <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>

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> 
   <intent-filter>
   <action android:name="com.baidu.location.service_v2.2" >
   </action>
    </intent-filter>
 </service>

 

然后再再<application></application>中添加:

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


3.代码准备阶段,完整代码如下:


package com.deom.dd.demo3;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.util.Log;
 import android.widget.TextView;
 import android.widget.Toast;

 import com.baidu.location.BDLocation;
 import com.baidu.location.BDLocationListener;
 import com.baidu.location.LocationClient;
 import com.baidu.location.LocationClientOption;
 import com.baidu.location.Poi;

 import java.util.List;

 public class MainActivity extends AppCompatActivity {
 private TextView myTV;
 public LocationClient mLocationClient = null;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 myTV = (TextView)findViewById(R.id.my_tv);

 BDLocationListener listener = new MyLocationListener();

 mLocationClient = new LocationClient(getApplicationContext());

 //注册监听器
 mLocationClient.registerLocationListener(listener);


 setOption();

 }

 class MyLocationListener implements BDLocationListener{
 @Override
 public void onReceiveLocation(BDLocation location) {
 if(location==null){
 return;
 }

 StringBuffer sb = new StringBuffer(256);
 sb.append("time : ");
 sb.append(location.getTime());
 sb.append("\nerror code : ");
 sb.append(location.getLocType());
 sb.append("\nlatitude : ");
 sb.append(location.getLatitude());
 sb.append("\nlontitude : ");
 sb.append(location.getLongitude());
 sb.append("\nradius : ");
 sb.append(location.getRadius());
 if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
 sb.append("\nspeed : ");
 sb.append(location.getSpeed());// 单位:公里每小时
 sb.append("\nsatellite : ");
 sb.append(location.getSatelliteNumber());
 sb.append("\nheight : ");
 sb.append(location.getAltitude());// 单位:米
 sb.append("\ndirection : ");
 sb.append(location.getDirection());// 单位度
 sb.append("\naddr : ");
 sb.append(location.getAddrStr());
 sb.append("\ndescribe : ");
 sb.append("gps定位成功");

 } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
 sb.append("\naddr : ");
 sb.append(location.getAddrStr());
 //运营商信息
 sb.append("\noperationers : ");
 sb.append(location.getOperators());
 sb.append("\ndescribe : ");
 sb.append("网络定位成功");
 } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
 sb.append("\ndescribe : ");
 sb.append("离线定位成功,离线定位结果也是有效的");
 } else if (location.getLocType() == BDLocation.TypeServerError) {
 sb.append("\ndescribe : ");
 sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
 } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
 sb.append("\ndescribe : ");
 sb.append("网络不同导致定位失败,请检查网络是否通畅");
 } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
 sb.append("\ndescribe : ");
 sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
 }
 sb.append("\nlocationdescribe : ");
 sb.append(location.getLocationDescribe());// 位置语义化信息
 List<Poi> list = location.getPoiList();// POI数据
 if (list != null) {
 sb.append("\npoilist size = : ");
 sb.append(list.size());
 for (Poi p : list) {
 sb.append("\npoi= : ");
 sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
 }
 }

 Log.v("TGA","***************************************"+sb.toString());
 myTV.setText(sb.toString());
 }
 }
private void setOption(){
 LocationClientOption option = new LocationClientOption();
 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
 );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
 option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
 int span = 5000; //5秒发送一次
 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仿真结果,默认需要
 option.setNeedDeviceDirect(true); //返回的定位结果包含手机机头方向
 mLocationClient.setLocOption(option);
 mLocationClient.start(); //启动位置请求
 mLocationClient.requestLocation();//发送请求
 }

 @Override
 protected void onDestroy() {
 super.onDestroy();
 mLocationClient.stop();
 }


 }

 

 注:定位效果仅限于真机