手机定位:获取我的位置经纬度

news/2024/11/17 7:34:57/

最近做一个关于 手机定位的功能,自己记录一下,一来加深记忆,二来希望能给大家一点思路,代码亲测有效。

直接贴代码:

清单文件要加的权限,代码中还有动态权限申请

<!--定位权限-->
<uses-permission android:name="android.permission.ACCESS_FIND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

布局不在给出只有一个button和一个textView

public class MainActivity extends AppCompatActivity {private Button getLocation;
    private TextView myLocation;
    private double latitudeGps;
    private double longitudeGps;
    private double latitudeNet;
    private double longitudeNet;
    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        setListener();
    }private void setListener() {getLocation.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View view) {myLocation.setText("您现在的位置经度是:"+longitudeGps+"维度是:"+latitudeGps);
            }});
    }private void initView() {getLocation = (Button) findViewById(R.id.getLocation_btn);
        myLocation = (TextView) findViewById(R.id.myLocation_tv);
        getMyLocation();
    }public void getMyLocation() {//要加动态权限,清单文件也要加权限
        //被拒绝情况
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED) {//申请
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 0);
            initLocation();
        } else {initLocation();
        }}//加载本地位置
    private void initLocation() {LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(false);
        criteria.setPowerRequirement(Criteria.POWER_LOW);
//
        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
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }Location locationGps = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        Location locationNet = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        if (locationGps!=null){latitudeGps = locationGps.getLatitude();
            longitudeGps = locationGps.getLongitude();
            choseLocationType();
        }else if (locationNet!=null){latitudeNet = locationNet.getLatitude();
            longitudeNet = locationGps.getLongitude();
            choseLocationType();
        }else {Toast.makeText(MainActivity.this,"获取位置失败,请检查网络",Toast.LENGTH_SHORT).show();
        }LocationListener locationListener = new LocationListener() {@Override
            public void onLocationChanged(Location location) {}@Override
            public void onStatusChanged(String s, int i, Bundle bundle) {}@Override
            public void onProviderEnabled(String s) {}@Override
            public void onProviderDisabled(String s) {}};
        //更新(间隔自己定义)
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,10,1000,locationListener);
    }private void choseLocationType() {if (latitudeNet>0&&latitudeGps<=0){latitudeGps=latitudeNet;
        }else if (longitudeNet>0&&longitudeGps<=0){longitudeGps=longitudeNet;
        }}
}

请注意以下几点:

一:第一次打开app可能获取到为0.0,关闭app再代开就可以,以后都正常,因为这里用了getLastKnowLocation 获得最后一次的

二:本文是获取经纬度,如果您还需要获取具体位置,可以尝试一下Goolge的location包提供的Geocoder类,他可以把经纬度转成具体位置还可以把具体位置转为经纬度,但鉴于Google服务的稳定性,您可以考虑一下借助百度的服务来获取具体位置信息。

三:关于Criteria类,这里引用一位大神的翻译我就直接贴过来了

在使用android lcoation的时候,可能不希望自己去硬性的选择是GPS服务还是NETWORK服务,可能是我们考虑的因素有很多,自己很难决定,Android SDK提供了一个类Criteria,直译为标准。

在使用android lcoation的时候,可能不希望自己去硬性的

public String getBestProvider (Criteria criteria, boolean enabledOnly)

Since: API Level 1

Returns the name of the provider that best meets the given criteria. Only providers that are permitted to be accessed by the calling activity will be returned. If several providers meet the criteria, the one with the best accuracy is returned. If no provider meets the criteria, the criteria are loosened in the following sequence: 

//翻译:返回满足给定的criteria(标准)的最佳provider,(前面一篇文章提到过两种重要provider的区别)。只有当provider权限允许的时候才会返回,如果几个provider均满足criteria设定的标准,最贴近标准的provider将会被返回。如果没有provider满足,标准将按照下面的序列放宽松。

    power requirement

    accuracy

    bearing

    speed

    altitude

选择是GPS服务还是NETWORK服务,可能是我们考虑的因素有很多,自己很难决定,Android SDK提供了一个类Criteria,直译为标准。




 
 



http://www.ppmy.cn/news/782470.html

相关文章

获取手机位置信息

Android支持通过LocationManager、LocationListener实时获取位置信息。 相关文档&#xff1a;请求位置权限 | Android 开发者 | Android Developers (google.cn) 目录 1、位置信息权限 1.1、App申请定位权限 1.2、检查权限授予状态 2、LocationManager 2.1、获取位置…

android 是否禁用gps,android-如果禁用了GPS,位置不会进入三星手机

我使用三星手机通过LocationManager API获取位置,如果禁用了GPS,则无法获取位置,但无法通过网络提供商获取位置. 这是代码,它在HTC&索尼甚至禁用了GPS,但在三星手机中却没有. public Location getLocation() { try { mLocationManager (LocationManager)this.getSystemSer…

如何用GPS找回丢失手机是所在位置

1.先看下布局的 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"fill_parent"android:layout_height"fill_parent"andro…

Android查看手机位置,安卓能不能查找iphone?安卓手机查iphone位置的方法

原标题&#xff1a;安卓能不能查找iphone&#xff1f;安卓手机查iphone位置的方法 最近&#xff0c;有网友留言询问&#xff1a;安卓能不能查找iphone&#xff1f;在经过了解之后&#xff0c;小编发现&#xff1a;安卓手机中没有查找iPhone的功能&#xff0c;所以&#xff0c;安…

【Linux系统编程】20.程序、进程、CPU和MMU、PCB

目录 程序 进程 CPU和MMU PCB 程序 编译好的二进制文件&#xff0c;存在磁盘上&#xff0c;只占用磁盘资源。 进程 进程是活跃的程序&#xff0c;占用系统资源&#xff0c;在内存中执行。程序运行起来&#xff0c;产生一个进程。 程序类似于剧本&#xff0c;进程类似于一场…

100天精通Golang(基础入门篇)——第14天:深入解析Go语言函数->从概念到实践,助您精通基础知识!(基础)

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

贝塞尔曲线 PH曲线 C曲线 B样条 NURBS样条曲线 三次Cardinal样条曲线对比 也涉及到不同曲线加速度的一些东西,不过有待细化

本文很多直接截图论文的&#xff0c;因为不需要重复造轮子&#xff0c;对比也只是为了选择更佳的路径规划曲线&#xff0c;对比于B曲线&#xff0c;时间不够&#xff0c;概括会有所疏漏&#xff0c;下表是曲线的对比表格&#xff0c;看完可以直接看下面&#xff0c;也涉及到不同…

c语言编写平面参数三次曲线,三次样条插值曲线的C语言实现

最近一个师弟问我关于机器人路径生成的问题&#xff0c;我也考虑这个问题很长时间了。去年做机器人比赛时就把机器人路径生成规划和存储跟随等这些功能实现了&#xff0c;但是当时因为没接触到三次样条曲线&#xff0c;所以路径函数的生成是用了比较笨的方法。最近接触到了三次…