android基于百度地图API的地理定位(不显示百度地图)+ 距离测量
前期准备:
跟着百度开放平台指导完成AK的申请以及Android Studio的配置
*开发版的SHA1参见于 pxM_Wxd 的 [Android]Android Studio获取开发版和发布版的MD5和SHA1
*发布版SHA1则 keytool -list -v -keystore 文件目录\自己的签名文件 (需要事先创建密钥)
开发:
由于我只需要显示定位位置信息,xml中只有一个TextView
Activity文件:
public class AttendanceActivity extends AppCompatActivity { public LocationClient mLocationClient; private TextView positionText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_attendance); //创建一个LocationClient的实例,接受的context通过getApplicationContext()方法获取。 mLocationClient = new LocationClient(getApplicationContext()); //调用LocationClient的registerLocationListener()方法来注册一个监听器 当获取到位置信息的时候,就会回调这个定位监听器 mLocationClient.registerLocationListener(new MyLocationListener()); positionText = findViewById(R.id.textView); /* * 之前在AndroidManifest.xml内声明了很多权限。 * 其中有4个是危险权限。不过ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION都属于一个权限组,所以两者只需要申请其中一个就可以了。 * 如何在运行时一次申请三个权限呢? * 首先创建一个空的List集合,然后依次判断这三个权限有没有被授权,如果没有授权就添加到List集合中,最后将List集合转化成数组,在调用ActivityCompat.requestPermissions()方法就可以一次性申请。 */ List<String> permissionList = new ArrayList<>(); if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.READ_PHONE_STATE); } if(ContextCompat.checkSelfPermission(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(this,permissions,1); }else{ requestLocation(); } } private void requestLocation(){ //实时更新 initLocation(); //调用start方法会回调到我们注册的监听器上面 mLocationClient.start(); } private void initLocation() { LocationClientOption option = new LocationClientOption(); //option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); option.setScanSpan(4000); option.setCoorType("bd09ll"); 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){ //将每个申请的权限都进行判断 如果存在一个没有被授权,那么就调用finish()方法关闭程序。 for(int result : grantResults){ if(result != PackageManager.PERMISSION_GRANTED){ Toast.makeText(AttendanceActivity.this,"必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show(); finish(); return ; } } //所有权限都已经授权,那么直接调用requestLocation()方法开始定位。 requestLocation(); }else{ Toast.makeText(AttendanceActivity.this,"发生未知错误", Toast.LENGTH_SHORT).show(); finish(); } break; default: break; } } public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(final BDLocation location) { runOnUiThread(new Runnable() { @Override public void run() { StringBuilder currentPosition = new StringBuilder(); //通过BDLocation的getLatitude()方法获取当前位置的纬度 currentPosition.append("纬度").append(location.getLatitude()).append("\n"); //通过BDLocation的getLongitude()方法获取当前位置的经度。 currentPosition.append("经线").append(location.getLongitude()).append("\n"); currentPosition.append("地址 ").append(location.getAddrStr()).append("\n"); LatLng locNow = new LatLng(location.getLatitude(),location.getLongitude()); double lat = 31.239150,longi=121.499862; //自行修改终点的 维度 和 精度 LatLng locComy = new LatLng(lat,longi); int dis = (int) DistanceUtil. getDistance(locNow, locComy); currentPosition.append("距离:").append(dis+"米").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"); // //getLocType()方法获取当前的定位方式。 // if(location.getLocType() == BDLocation.TypeGpsLocation){ // currentPosition.append("GPS"); // }else if(location.getLocType() == BDLocation.TypeNetWorkLocation){ // currentPosition.append("网络"); // } Log.i("pos",currentPosition+""); positionText.setText(currentPosition); } }); } } @Override protected void onDestroy(){ super.onDestroy(); mLocationClient.stop(); } }
就搞定啦!