Android Studio项目使用百度定位

准备阶段:
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号和大体定位时间到[email protected],会有人追查原因");
} 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();
}


}
 
 注:定位效果仅限于真机

猜你喜欢

转载自blog.csdn.net/Mr__dingding/article/details/86068853