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("
");
                    //通过BDLocation的getLongitude()方法获取当前位置的经度。
                    currentPosition.append("经线").append(location.getLongitude()).append("
");
                    currentPosition.append("地址 ").append(location.getAddrStr()).append("
");

                    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("
");
//                    currentPosition.append("国家").append(location.getCountry()).append("
");
//                    currentPosition.append("省").append(location.getProvince()).append("
");
//                    currentPosition.append("市").append(location.getCity()).append("
");
//                    currentPosition.append("区").append(location.getDistrict()).append("
");
//                    currentPosition.append("街道").append(location.getStreet()).append("
");

//                    //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();
    }
}

就搞定啦!

原文地址:https://www.cnblogs.com/Nora-F/p/10369608.html