单独无聊的单机程序并没有意思,我们何不在程序里面加上有趣的网络呢,
这次我们主要是讲关于Android手机的定位系统,本次使用的是百度定位。
下面表格是提供的两个我们后面需要的地址
百度定位下载地址 | http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=location_all |
获取密匙地址 | http://lbsyun.baidu.com/apiconsole/key |
选中点击开发包,现在完成后会是一个压缩包,解压完后会有如下文件和文件夹:
这里的我们需要把这些文件放到我们写项目里面,根据路径,我们在项目工程的路径里面找到libs文件夹,把BaiduLBS_Android.jar文件放到libs文件夹里面,在src/main文件夹下创建jniLibs文件夹,把剩下的文件夹放到jniLibs文件夹里面,这个时候因为我们的这些文件都是复制进去的,所以这个时候我们的这些程序根本起不到作用,所以这个时候我们需要重构下,点击界面上的这个按钮即可。等待完成。
首先,因为我们的需要的是定位功能,所以我们要加入如下权限:
android.permission.ACCESS_COARSE_LOCATION | 访问CellID或WiFi,只要当前设备可以接收到基站的服务信号,便可获得位置信息。 |
android.permission.ACCESS_FINE_LOCATION | 允许一个程序访问精良位置(如GPS) |
android.permission.ACCESS_WIFI_STATE | 允许程序访问Wi-Fi状态信息 |
android.permission.ACCESS_NETWORK_STATE | 允许程序访问网络信息 |
android.permission.CHANGE_WIFI_STATE | 允许程序改变Wi-Fi连接状态 |
android.permission.READ_PHONE_STATE |
读取手机状态 |
android.permission.WRITE_EXTERNAL_STORAGE | 外部存储写权限 |
android.permission.INTERNET | 网络套接字访问权限(网络访问权限) |
android.permission.MOUNT_UNMOUNT_FILESYSTEMS | 允许创建与删除权限 |
android.permission.WAKE_LOCK | 保持屏幕唤醒 |
一定要加入这些权限。这是还需要在程序中注册服务
这个时候就用到了我们申请的key值:
这样我们的AndroidManifest.xml就配置完成了
那么就先来展示我们写的代码,稍后进行代码解释:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationLisener());
setContentView(R.layout.activity_main);
initView();
initLocation();
List<String> permissions = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissions.isEmpty()) {
String[] permission_q = permissions.toArray(new String[permissions.size()]);
ActivityCompat.requestPermissions(MainActivity.this, permission_q, 1);
} else {
requestLocation();
}
}
在onCreate方法中,我们需要创建一个LocationClient的实例,这个的构造参数是一个context参数,这里用过getApplicationContext方法来获取一个迁居的context参数,然后通过registerLocationListener来注册一个监听器,每当获得到定位的信息时,就会调用这个监听器。
上面我们说到这个程序我们用到了很多的权限,其中包括危险权限和普通权限,所以在这里我们有四个权限四危险权限,所以在这里我们还是要再次申请下权限,因为在这四个全险中,有两个权限是在一个权限组里面的,所以我只需要申请这个权限组就可以了。
我们这里的申请权限的方式是,判断权限是否处于授权许可状态,如果不是授权许可状态,将权限加入List集合中,在再次申请权限的时候讲集合里面你的数据转换成字符串数组的格式通过ActivityCompat.requestpermissions来再次申请权限。
这里我需要一个requestLocation方法来开启定位
private void requestLocation() {
mLocationClient.start();
}
当定位成功后就要回调定位监听
public class MyLocationLisener implements BDLocationListener{
@Override
public void onReceiveLocation(final BDLocation bdLocation) {
runOnUiThread(new Runnable() {
@Override
public void run() {
StringBuilder builder = new StringBuilder();
builder.append("纬度:").append(bdLocation.getLatitude()).append("\n");
builder.append("经度:").append(bdLocation.getLongitude()).append("\n");
builder.append("城市:").append(bdLocation.getCity());
textView.setText(builder);
}
});
}
}
这个当定位成功后,可以通过bdLocation#方法的方式来获取到想要的数据
这里我还要一个请求权限的结果,判断是否有权限并给出提示
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_GRANTED){
Toast.makeText(MainActivity.this,"许可授权才能使用此功能",Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
}else{
Toast.makeText(MainActivity.this,"发生未知错误",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
下部分的代码是Android界面布局代码,这里就不做出解释
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context=".MainActivity">
<TextView
android:id="@+id/showLocation"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>
这个是Android运行后的结果,这个结果只是让大家看下,因为这个程序使用的是模拟器运行的程序,所以里面的数据获取的好像是错误的,大家把程序放到了真机上运行就可以获取出正确的信息