位置定位LocationManager

简单的获取当前位置对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //提供位置定位服务的位置管理器对象,中枢控制系统
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //位置提供器,也就是实际上来定位的对象,这里选择的是GPS定位
        String locationProvider = LocationManager.NETWORK_PROVIDER;
        //开始定位,获取包含上次记录的位置数据的位置对象
        Location location = locationManager.getLastKnownLocation(locationProvider);
        //获取纬度
        Double latitude = location.getLatitude();
        //获取经度
        Double longitude = location.getLongitude();
        Log.e("Latitude", String.valueOf(latitude));
        Log.e("Longitude", String.valueOf(longitude));
    }

执行时,会出现getLastKnownLocation获取不到对象,抛出NullException。使用getProvider方法获取手机上的位置提供器,可以看到高精度定位下,有三种位置提供器可供使用
其实从这个方法名可以知道他是获取上次记录下的位置信息,如果是新设备,或者恢复工厂设置的手机,就会报出异常,这里用的模拟器还没记录过位置信息,所以一直报空异常

高精度定位

根据 getLastKnownLocation()返回null的解决这个,发现可以使用requestLocationUpdates方法注册位置更新

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //提供位置定位服务的位置管理器对象,中枢控制系统
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //位置提供器,也就是实际上来定位的对象,这里选择的是GPS定位
        String locationProvider = LocationManager.PASSIVE_PROVIDER;
        //获取手机中开启的位置提供器
        List<String> providers = locationManager.getProviders(true);
        //开始定位,获取当前位置对象
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        Location location = locationManager.getLastKnownLocation(locationProvider);
        while (location == null) {
            //每1s监听一次位置信息,如果位置距离改变超过1m。就执行onLocationChanged方法
            //如果第一次打开没有显示位置信息,可以退出程序重新进入,就会显示
            locationManager.requestLocationUpdates("gps", 1000,1,new locationListener());
        }
        //获取纬度
        Double latitude = location.getLatitude();
        //获取经度
        Double longitude = location.getLongitude();
        Log.e("Latitude", String.valueOf(latitude));
        Log.e("Longitude", String.valueOf(longitude));
    }

locationListener.java位置监听器

可以理解为,先开启监听器监听位置信息,位置更改后记录有了位置数据,然后就可以使用getLastKnownLocation获取上一次的位置数据,所以


public class locationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {
        Log.e("位置提供器:", "启用");
    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

反向编码经纬度获得可理解地理位置

1、注册为高德地图开放平台的开发者
2、在控制台添加新key,选择Web服务,获取key,才可以使用高德地图的api

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

MainActivity.java
异步处理回调函数返回的相应地址数据,进行UI展示

public class MainActivity extends Activity {
    TextView textview;
    private Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1){
                textview = findViewById(R.id.textview0);
                textview.setText(msg.obj.toString());
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        httputils.requestHttp("116.310003", "39.991957", new callback2showcontent() {
            @Override
            public void showJSON(String response) {
                //这个方法还是在子线程中,想要处理UI操作,异步线程
                Message message = new Message();
                message.what = 1;
                message.obj = response;
                handler.sendMessage(message);
            }
        });
        Toast.makeText(this,"successful", Toast.LENGTH_LONG);
    }
}

httputils.java
封装的http请求

public class httputils {
    private static URL url;
    public static void requestHttp(final String latitude, final String longitude, final callback2showcontent func){

        new Thread(new Runnable() {
            HttpResponse response;
            String returnResutJSON;
            @Override
            public void run() {
                StringBuilder stringbuilder = new StringBuilder("https://restapi.amap.com/v3/geocode/regeo?output=JSON&key=<你的web服务key>&radius=1000&extensions=all");
                stringbuilder.append("&location=" + latitude + "," + longitude);
                try {
                    url = new URL(stringbuilder.toString());
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                HttpClient httpclient = new DefaultHttpClient();
                HttpGet get = new HttpGet(url.toString());
                try {
                    //http相应数据
                    response = httpclient.execute(get);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if(response.getStatusLine().getStatusCode() == 200){

                    try {
                        returnResutJSON = EntityUtils.toString(response.getEntity());
                        func.showJSON(returnResutJSON);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

使用高德地图显示位置

需要使用第三方平台的API接口,来返回具体位置,这里我使用的是高德地图API
1、注册为高德地图开放平台的开发者
2、在控制台创建应用,然后获取API key(keytool -list -v -keystore <.keystore文件的路径>)可见说明https://lbs.amap.com/faq/top/hot-questions/249
3、在android studio的编辑器的文件配置

https://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project

1、将jar包放入libs目录,然后右键add as library
2、获取密钥,默认密码android
keytool -list -keystore C:\Users\xxxx\.android\debug.keystore -v
AndroidManifest.xml

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="<你的密钥>"/>
......
    </application>
   <!--允许程序打开网络套接字-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--允许程序设置内置sd卡的写权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--允许程序获取网络状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--允许程序访问WiFi网络信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--允许程序读写手机状态和身份-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

activity_layout.xml
地图容器控件

    <com.amap.api.maps.MapView
        android:id="@+id/mapview"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

MainActivity.java

    private MapView mapview = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //引用地图控件
        mapview = (MapView)findViewById(R.id.mapview);
        //创建地图
        mapview.onCreate(savedInstanceState);
    }
展示结果

定位自己所在位置

public class MainActivity extends Activity {

    private MapView mapview = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //引用地图控件
        mapview = (MapView)findViewById(R.id.mapview);
        //创建地图
        mapview.onCreate(savedInstanceState);
        //地图管理器:显示地图
        AMap amap = mapview.getMap();
        /*
         显示当前自己的位置
          */
        //初始化蓝点对象
        MyLocationStyle mylocation = new MyLocationStyle();
        //定位时间间隔
        mylocation.interval(1000);
        //将配置好的蓝点对象由管理器进行设置
        amap.setMyLocationStyle(mylocation);
        //设置默认定位按钮
//        amap.getUiSettings().setMyLocationButtonEnabled(true);
        //启动定位蓝点
        amap.setMyLocationEnabled(true);
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • 测试IE6及IE6+推荐:良心总结 IE8中input[button|submit]不能用margin:0 aut...
    Miss____Du阅读 946评论 0 9
  • 上一篇 介绍了通过vue.js绑定class和style样式,这次我们一起学习vue.js中的条件渲染。 v-if...
    webCoder阅读 1,986评论 0 1