zoukankan      html  css  js  c++  java
  • 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();
        }
    }

    就搞定啦!

  • 相关阅读:
    USB 描述符详细解析,来自老外网站,比协议描述清晰
    linux那些事儿之我是usb
    usb开源项目
    Quartus II 增量编译
    Quartus II 与 Modelsim 联调【转】
    Matlab语法
    RC上电复位时间计算
    Quartus 编译错误
    UltraEdit 所有快捷键 说明
    [转载]BT656/BT601/BT1120协议
  • 原文地址:https://www.cnblogs.com/Nora-F/p/10369608.html
Copyright © 2011-2022 走看看