Android:原生的手机获取经纬度得到当前位置

Android:原生的手机获取经纬度得到当前位置,第1张

概述这是一套完整的代码,模拟器与真机调试可用1.首先得注册权限android:name="android.permission.ACCESS_COARSE_LOCATION"android:name="android.permission.ACCESS_FINE_LOCATION"1.1其次最重要的是,申请权限,一直真机调试不成功,折磨死我啦,放在protectedvoidonCreate方法

这是一套完整的代码,模拟器与真机调试可用

1.首先得注册权限
androID:name="androID.permission.ACCESS_COARSE_LOCATION"androID:name="androID.permission.ACCESS_FINE_LOCATION" 

1.1其次最重要的是,申请权限,一直真机调试不成功,折磨死我啦,放在protected voID onCreate方法就可以

if(ContextCompat.checkSelfPermission(EventsReportedActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)        != PackageManager.PERMISSION_GRANTED){//未开启定位权限    //开启定位权限,200是标识码    ActivityCompat.requestPermissions(EventsReportedActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},200);}else{    initLocation();//初始化定位信息    Toast.makeText(EventsReportedActivity.this,"已开启定位权限", Toast.LENGTH_LONG).show();}

1.2这边再回调一下

 @OverrIDe    public voID onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode){            case 200://刚才的识别码                if(grantResults[0] == PackageManager.PERMISSION_GRANTED){//用户同意权限,执行我们的 *** 作                    initLocation();//开始定位                }else{//用户拒绝之后,当然我们也可以d出一个窗口,直接跳转到系统设置页面                    Toast.makeText(EventsReportedActivity.this,"未开启定位权限,请手动到设置去开启权限",Toast.LENGTH_LONG).show();                }                break;            default:break;        }    }

写到这里差不多就结束啦,

2.获取经纬度

2.1工具类

package com.skyinfor.szls.Util;import androID.Manifest;import androID.content.Context;import androID.content.pm.PackageManager;import androID.location.Location;import androID.location.LocationListener;import androID.location.LocationManager;import androID.os.Build;import androID.os.Bundle;import androID.util.Log;import androIDx.core.app.ActivityCompat;import java.util.List;import static androID.content.ContentValues.TAG;public class LocationUtils {    private volatile static LocationUtils uniqueInstance;    private LocationManager locationManager;    private String locationProvIDer;    private Location location;    private Context mContext;    private LocationUtils(Context context) {        mContext = context;        getLocation();    }    //采用Double CheckLock(DCL)实现单例    public static LocationUtils getInstance(Context context) {        if (uniqueInstance == null) {            synchronized (LocationUtils.class) {                if (uniqueInstance == null) {                    uniqueInstance = new LocationUtils(context);                }            }        }        return uniqueInstance;    }    private voID getLocation() {        //1.获取位置管理器        locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);        //2.获取位置提供器,GPS或是NetWork        List<String> provIDers = locationManager.getProvIDers(true);        if (provIDers.contains(LocationManager.NETWORK_PROVIDER)) {            //如果是网络定位            Log.d(TAG, "如果是网络定位");            locationProvIDer = LocationManager.NETWORK_PROVIDER;        } else if (provIDers.contains(LocationManager.GPS_PROVIDER)) {            //如果是GPS定位            Log.d(TAG, "如果是GPS定位");            locationProvIDer = LocationManager.GPS_PROVIDER;        } else {            Log.d(TAG, "没有可用的位置提供器");            return;        }        // 需要检查权限,否则编译报错,想抽取成方法都不行,还是会报错。只能这样重复 code 了。        if (Build.VERSION.SDK_INT >= 23 &&                ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&                ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return;        }        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return;        }        //3.获取上次的位置,一般第一次运行,此值为null        Location location = locationManager.getLastKNownLocation(locationProvIDer);        if (location != null) {            setLocation(location);        }        // 监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离mindistace        locationManager.requestLocationUpdates(locationProvIDer, 0, 0, locationListener);    }    private voID setLocation(Location location) {        this.location = location;        String address = "纬度:" + location.getLatitude() + "经度:" + location.getLongitude();        Log.d(TAG, address);    }    //获取经纬度    public Location showLocation() {        return location;    }    // 移除定位监听    public voID removeLocationUpdatesListener() {        // 需要检查权限,否则编译不过        if (Build.VERSION.SDK_INT >= 23 &&                ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&                ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return;        }        if (locationManager != null) {            uniqueInstance = null;            locationManager.removeUpdates(locationListener);        }    }    /**     * LocationListern监听器     * 参数:地理位置提供器、监听位置变化的时间间隔、位置变化的距离间隔、LocationListener监听器     */    LocationListener locationListener = new LocationListener() {        /**         * 当某个位置提供者的状态发生改变时         */        @OverrIDe        public voID onStatusChanged(String provIDer, int status, Bundle arg2) {        }        /**         * 某个设备打开时         */        @OverrIDe        public voID onProvIDerEnabled(String provIDer) {        }        /**         * 某个设备关闭时         */        @OverrIDe        public voID onProvIDerDisabled(String provIDer) {        }        /**         * 手机位置发生变动         */        @OverrIDe        public voID onLocationChanged(Location location) {            location.getAccuracy();//精确度            setLocation(location);        }    };}

2.2调用

    private voID initLocation(){        Location location = LocationUtils.getInstance( EventsReportedActivity.this ).showLocation();        if (location != null) {            String address = "纬度:" + location.getLatitude() + "经度:" + location.getLongitude();            Log.d( "FLY.LocationUtils", address );            //text_location.setText( address );            text_location.setText(  getAddress(location.getLongitude(),location.getLatitude()));        }    }
3.转为具体地址

3.1方法

    public String getAddress(double lnt, double lat) {        Geocoder geocoder = new Geocoder(EventsReportedActivity.this);        boolean falg = geocoder.isPresent();        Log.e("the falg is " + falg,"the falg is ");        StringBuilder stringBuilder = new StringBuilder();        try {            //根据经纬度获取地理位置信息---这里会获取最近的几组地址信息,具体几组由最后一个参数决定            List<Address> addresses = geocoder.getFromLocation(lat, lnt, 1);            if (addresses.size() > 0) {                Address address = addresses.get(0);                for (int i = 0; i < address.getMaxAddresslineIndex(); i++) {                    //每一组地址里面还会有许多地址。这里我取的前2个地址。xxx街道-xxx位置                    if (i == 0) {                        stringBuilder.append(address.getAddressline(i)).append("-");                    }                    if (i == 1) {                        stringBuilder.append(address.getAddressline(i));                        break;                    }                }                //stringBuilder.append(address.getCountryname()).append("");//国家                stringBuilder.append(address.getadminArea()).append("");//省份                stringBuilder.append(address.getLocality()).append("");//市                stringBuilder.append(address.getFeaturename()).append("");//周边地址//                stringBuilder.append(address.getCountryCode()).append("_");//国家编码//                stringBuilder.append(address.getThoroughfare()).append("_");//道路                Log.d("thistt", "地址信息--->" + stringBuilder);            }        } catch (Exception e) {            Log.d("获取经纬度地址异常","");            e.printstacktrace();        }        return stringBuilder.toString();    }

3.2调用

String Address = getAddress(location.getLongitude(),location.getLatitude());
总结

以上是内存溢出为你收集整理的Android:原生的手机获取经纬度得到当前位置全部内容,希望文章能够帮你解决Android:原生的手机获取经纬度得到当前位置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1049789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存