——首先准备LBS SDK ,下载基础地图和定位功能这两个SDK,解压包中会有一个libs目录:
——libs目录下的内容分为两部分,BaiduLBS_Android.jar, so文件
——Android studio中app模板下有一个libs目录,存放Jar包的,将BaiduLBS_Android.jar 文件复制到该目录下。
—— Android studio中的 src/main目录, 右键该目录——new ——Directory,名为jniLibs目录,将so文件拷贝到此目录下。
在app/build.gradle下,添加此配置:
compile fileTree(dir: 'libs',includes: ['*.jar']) //将libs 目录下所有以.jar结尾的文件添加到当前项目的引用中
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.lnjr.lbstest.MainActivity">
<!--确定自己的经纬度-->
<TextView
android:id="@+id/position_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
修该AndroidManifest中代码:
百度LBS,SDK内部用的权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<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"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<application
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="i6VD2fHKM3msMfZtIOXAhFSzDiYGFIwL">
</meta-data>
<service android:name="com.baidu.location.f"
android:enabled="true" android:process=":remote">
</service>
</application>
MainActivity.java:
public class MainActivity extends AppCompatActivity {
public LocationClient mLocationClient; //创建一个LocationClient实例
private TextView positionText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext()); //调用方法,获取实例
mLocationClient.registerLocationListener(new MyLocationListener());//注册一个定位监听器
setContentView(R.layout.activity_main);
positionText = findViewById(R.id.position_text_view);
List<String> permissionList = new ArrayList<>();//创建一个空的List集合,
// 然后判断这三个权限有没有被授权,如果没被授权就添加到List集合中
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty()) {
//将List转换成数组,调用requestPermissions()方法一次性申请
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
} else {
requestLocation();
}
}
//当所有权限都被用户同意了,才会调用此方法,开始地理位置定位
private void requestLocation() {
initLocation();
mLocationClient.start(); //回调前面的监听器
}
private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);//设置更新的间隔,每5秒会更新一下当前位置
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors); //转换GPS定位
option.setIsNeedAddress(true);//需要获取当前位置的详细地址
mLocationClient.setLocOption(option);
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
}
@Override//通过循环将申请的每一个权限进行判断如果有任何一个权限被拒绝,就直接调用finfish()方法关闭当前程序
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_DENIED) {
Toast.makeText(this, "必须同意所有权限才能使用本程序", Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
} else {
Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
private class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(final BDLocation location) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//getLatitude()方法,获取当前位置纬度
//getLongitude()方法,获取当前位置经度
//getLocType()方法,获取当前的定位方式
StringBuilder currentPosition = new StringBuilder();
currentPosition.append("纬度:").append(location.getLatitude()).append("\n");
currentPosition.append("经度:").append(location.getLongitude()).append("\n");
currentPosition.append("国家:").append(location.getCountry()).append("\n");
currentPosition.append("省:").append(location.getProvince()).append("\n");
currentPosition.append("市:").append(location.getCity()).append("\n");
currentPosition.append("区:").append(location.getDistrict()).append("\n");
currentPosition.append("街道:").append(location.getStreet()).append("\n");
currentPosition.append("定位方式:");
if (location.getLocType() == BDLocation.TypeGpsLocation) {
currentPosition.append("GPS");
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
currentPosition.append("网络");
}
//将结果组装成一个字符串,显示到TextView上
positionText.setText(currentPosition);
}
});
}
}
}