*位置的服务(Location Based Service)
基于位置的服务简称LBS,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动设备所在的位置。
基于位置的服务所围绕的核心就是要先确定出用户所在的位置。一种是通过GPS定位,一种是通过网络定位。GPS定位的工作原理是基于手机内置的GPS硬件直接和卫星交互来获取当前的经纬度信息,这种定位方式精确度非常高,但确定是只能在室外使用,室内基本无法接受到卫星的信号。网络定位的工作原理是根据手机当前网络附近的三个基站进行测速,以此计算出手机和每个基站之间的距离,在通过三角定位确定出一个大概的位置,这种定位方式精确度一般,但有点是在室内室外都可以使用。(引用郭霖老师书中的知识)
首先需要申请百度地图密钥: https://blog.csdn.net/weixin_42813606/article/details/88556804.这个连接里面有如何获取密钥。
还得需要申请百度地图SDK,在这里我就不介绍如何申请了,申请下来的就是如下所示:
话不多说,先上个案列更加明确。
首先需要创建一个安卓项目,这个我就更加不要接受如何创建了。
只需要把压缩包放进libs下面,其他的需要在创建一个包名字为jniLibs,
jniLibs文件夹是默认的,如果用其他名字需要在app目录下gradle配置文件中指定重定向的目录,没有必要了。
在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=".MainActivity">
<TextView
android:id="@+id/position_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
主要是通过一个TextView来显示出。
在java中编写如下代码:
public class MainActivity extends AppCompatActivity {
public LocationClient mLocationClient;//定位服务的客户端。宿主程序在客户端声明此类,并调用
private TextView positionText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient=new LocationClient(getApplicationContext());//调用getApplicationContext()方法来调用一个全局的Context参数并传入
mLocationClient.registerLocationListener(new MyLocationListener());//调用.registerLocationListener()方法来注册一个定位监听器,当你获得
//位置信息的时候,就会回调这个定位监听器
setContentView(R.layout.activity_main);
positionText=(TextView)findViewById(R.id.position_text_view);
List<String> permissionList=new ArrayList<>();
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()){
String[] permissions=permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
}else {
requestLocation();
}
}
private void requestLocation() {
initLocation();
mLocationClient.start();//开始定位,定位的结果会回调到我们前面注册的监听器中MyLocationListener
//LocationClient的start()方法只会定位一次
}
private void initLocation() {
LocationClientOption option=new LocationClientOption();
option.setScanSpan(4000);//设置更新的间隔 多长时间进行一次请求
option.setIsNeedAddress(true);//是否获取当前详细的地址信息
mLocationClient.setLocOption(option);// 使用设置
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length>0){
for (int result:grantResults){
if (result!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
}else {
Toast.makeText(this,"发生未知错误",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
StringBuilder currentPosition=new StringBuilder();
//BDLocation的getLatitude()方法获取当前位置的纬度
currentPosition.append("纬度:").append(bdLocation.getLatitude()).append("\n");
//BDLocation的getLongitude()方法获取当前位置的经度
currentPosition.append("经线:").append(bdLocation.getLongitude()).append("\n");
currentPosition.append("国家:").append(bdLocation.getCountry()).append("\n");
currentPosition.append("省:").append(bdLocation.getProvince()).append("\n");
currentPosition.append("市:").append(bdLocation.getCity()).append("\n");
currentPosition.append("区:").append(bdLocation.getDistrict()).append("\n");
currentPosition.append("街道:").append(bdLocation.getStreet()).append("\n");
currentPosition.append("定位方式:");
//BDLocation的getLocType()方法获取当前位置的定位方式
if (bdLocation.getLocType()==BDLocation.TypeGpsLocation){
currentPosition.append("GPS");
}
if (bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
}
}
主要的我在代码上已经注释了,在这里我就不在讲述了。
最后别忘了要设置权限和注册你所申请的百度密钥:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.lbstest3">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name="com.baidu.lbsapi.API_KEY"
android:value="ADuRoL0gilmwrS6MnskQyWGSaaQxhwaH"/>
<service android:name="com.baidu.location.f" android:enabled="true"
android:process=":remote"
/>
</application>
</manifest>
这是Manifest.xml中要写的。
这就是一个简单的定位你所在的位置。
效果图如下: