zoukankan      html  css  js  c++  java
  • LocationManager的使用

    MainActivity.java

    package com.sdutacm.locationservice;
    
    import android.Manifest;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.location.Address;
    import android.location.Geocoder;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity implements LocationListener{
    
        //android中进行地理位置定位主要使用的类是LocationManager类,
        //使用LocationManager的方法就先使用其他服务,只需要调用getSystemService()就能获得他的实例,
        // 并获得他的引用,当然这里需要传入参数Context.LOCATION_SERVICE
        LocationManager locationManager;
        //当获得Location对象后,直接通过LocationManager调用LastKnownLocation()方法就可以获得Location对象,
        //而Location类正是保存位置信息的类
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            initLocation();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if(locationManager != null){
                checkPermission(new String[]{
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_FINE_LOCATION
                });
                //解除监听
                locationManager.removeUpdates(this);
                locationManager =null;
            }
        }
        private void initLocation() {
            checkPermission(new String []{
                Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_FINE_LOCATION
            });
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            //这里使用GPS位置提供者作为案例
            Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            //监听位置变化,每个两秒且距离差距为10米时更新位置信息,这助于控制电量
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,2000,10,this);
            if(location != null){
                Log.d("location","1 纬度: "+location.getLatitude()+",经度: "+location.getLongitude());
                getLocation(location);
            }
        }
    
        private void getLocation(Location location) {
            Log.d("location","123321");
            Geocoder geocoder = new Geocoder(this);
            Log.d("location","123");
            if(geocoder.isPresent()){
                Log.d("location","geocoder is OK");
            }
    
    
            try {
                Log.d("location","123456");
                //使用Geocoder获得具体的地址,参数为纬度和经度
                List<Address> addresses = new ArrayList<Address>();
                addresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);
    
                    Log.d("location","as is the "+geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1));
    
                Log.d("location","123654addresses.get(0) is the "+addresses.get(0));
    
                Address address = addresses.get(0);
                Log.d("location","12333333");
                Log.d("location","address is the "+address+" addresses.get(0) "+addresses.get(0));
                Log.d("location",address.getAddressLine(1)+address.getFeatureName());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        @Override
        public void onLocationChanged(Location location) {
            //当符合监听条件时,会更新地理位置
            Log.d("location","纬度: "+location.getLatitude()+", 经度"+location.getLatitude());
            getLocation(location);
        }
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
    
        }
    
        @Override
        public void onProviderEnabled(String provider) {
    
        }
    
        @Override
        public void onProviderDisabled(String provider) {
    
        }
        private void checkPermission(String[] permissions) {
            int permission_granted = PackageManager.PERMISSION_GRANTED;
            boolean flag = false;
            for (int i=0;i<permissions.length;i++){
                int checkPermission = ActivityCompat.checkSelfPermission(this,permissions[i]);
                if(permission_granted != checkPermission){
                    flag = true;
                    break;
                }
            }
            if(flag){
                ActivityCompat.requestPermissions(this,permissions,111);
                return;
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode){
                case 111:
                    if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                        Toast.makeText(this,"获取权限成功!",Toast.LENGTH_SHORT).show();
                    }else {
                        Toast.makeText(this,"获取权限失败",Toast.LENGTH_SHORT).show();
                    }
                    break;
                default:
                    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
    
        }
    }
    
  • 相关阅读:
    WebGL着色器32位浮点数精度损失问题
    Web地图呈现原理
    虚拟DOM详解
    webgl开发第一道坎——矩阵与坐标变换
    作为前端应当了解的Web缓存知识
    浅谈模板引擎
    WebGL中深度碰撞方法总结
    不加班的项目从排期开始
    从0到1带人做项目
    webgl自学笔记——深度监测与混合
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11781866.html
Copyright © 2011-2022 走看看