开发工具 Android Studio
这里用到的地位功能分为两种,一种是GPS定位功能,更加准确,室内不可用信号较弱,不过对手机的硬件有相应的要求
第二种是网络定位功能,在室内也能使用,相对来说没有那么准确。
用到的第三方包是百度地图BaiduLBS_Android.jar开发流程如下:
1.需要申请一个APIkey,去百度地图官网申请一个账号网址如下:http://developer.baidu.com/user/reg
完成相应的注册,只用填写带有“*”号的部分,验证完成后跳转到http://lbsyun.baidu.com/apiconsolekey然后
同意开发者协议,创建一个应用,其中截图如下:
其中AK是我申请到的百度地图的APIkey
点击创建应用,分类按下列选择
其中的发布版本的SHA1相信大家已经熟悉怎么填写了吧,就是打开Android studio的右边Gradle界面,其中的
app->Tasks->android->signingRepoert点击运行
其中的SHA1就是暂时得到的发布版本的,暂时先使用这个发布版本和开发版相同,填写好之后点击申请,可以得到引用的APIkey。
接下来就是下载LBS.SDK访问的网站如下:
http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=location_all
选择其中两个基础的定位功能分别是基础定位和基础室内定位如下:
点击下载完后之后解压获得LBS_android.jar的包,然后导入到libs文件下,然后把剩下的所有文件导入到src->main的新建文件夹jniLibs文件夹下,最后sync项目一下就可以使用了
接下来创建我们自己的main_activity_xml文件如下;
xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.example.administrator.lbstest.MainActivity"> android:id="@+id/position_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone"/> android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true"/>
其中添加的MapView控件是为了绘制百度地图的图像的控件
在AndroidManifest.xml文件中添加相应的权限和添加API_KEY.和授权定位权限如下:
xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.lbstest"> android:name="android.permission.ACCESS_COARSE_LOCATION"/> android:name="android.permission.ACCESS_FINE_LOCATION"/> android:name="android.permission.ACCESS_WIFI_STATE"/> android:name="android.permission.ACCESS_NETWORK_STATE"/> android:name="android.permission.CHANGE_WIFI_STATE"/> android:name="android.permission.READ_PHONE_STATE"/> android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> android:name="android.permission.INTERNET"/> android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> android:name="android.permission.WAKE_LOCK"/> android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> android:name="com.baidu.lbsapi.API_KEY" android:value="XpaueacTI9uEUwy1OPSDTZ0lA9CfEFCA" /> android:name=".MainActivity"> android:name="android.intent.action.MAIN" /> android:name="android.intent.category.LAUNCHER" /> android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
记得在APP的build.gradle文件中导入要用到的库
compile fileTree(dir:'libs',include:['*.jar'])
最后MainActivity代码如下:
package com.example.administrator.lbstest; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; 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.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { public LocationClient mLocationClient; private TextView positionText; //绘制地图的控件 private MapView mapView; //创建地图的总控制器来实现地图的操作 private BaiduMap baiduMap; //判断是否是第一次定位 private boolean isFirstLocate = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(new MyLocationListener()); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.bmapView); //获取地图控制器对象 baiduMap = mapView.getMap(); baiduMap.setMyLocationEnabled(true); init(); } //创建一个控制地图更新到当前位置的方法 private void navigateTo(BDLocation location){ if(isFirstLocate){ //通过LagLng的方法实现更新地图位置的操作 LatLng ll = new LatLng(location.getLatitude(),location.getLongitude()); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update); update = MapStatusUpdateFactory.zoomTo(16f); baiduMap.animateMapStatus(update); isFirstLocate = false; } //在地图中显示我的位置 MyLocationData.Builder locationBuilder = new MyLocationData.Builder(); locationBuilder.latitude(location.getLatitude()); locationBuilder.longitude(location.getLongitude()); MyLocationData locationData = locationBuilder.build(); baiduMap.setMyLocationData(locationData); } private void init() { positionText = (TextView) findViewById(R.id.position_text_view); //判断是否授予权限 ListpermissionList = 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(); } } //这三种方法是为了实现资源的即使的释放和管理 @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); mapView.onDestroy(); baiduMap.setMyLocationEnabled(false); } private void requestLocation() { initLocation(); mLocationClient.start(); } private void initLocation() { LocationClientOption option = new LocationClientOption(); option.setScanSpan(5000); 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(); // //定位的详细信息 // currentPosition.append("纬度:").append(bdLocation.getLatitude()).append("\n"); // 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("定位方式:"); // if (bdLocation.getLocType() == BDLocation.TypeGpsLocation){ // currentPosition.append("GPS"); // }else if(bdLocation.getLocType() == BDLocation.TypeNetWorkLocation){ // currentPosition.append("网络"); // } // positionText.setText(currentPosition); //将值传入navigateTo方法实现重新绘制地图操作 if (bdLocation.getLocType() == BDLocation.TypeGpsLocation || bdLocation.getLocType() == BDLocation.TypeNetWorkLocation){ navigateTo(bdLocation); } } } }
运行程序实现效果图如下:
(因为运用虚拟机运行,GPS的定位功能错误,没有做找到位置使用的默认的位置如下)