当前位置:   article > 正文

Android 获取定位权限,获取位置信息(国家、地区、经纬)_android.permission.access_fine_location

android.permission.access_fine_location

第一步 授权

在 AndroidManifest.xml 中加上位置信息权限按需要添加

  1. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 如果需要精确定位的话请加上此权限 -->
  2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 如果需要粗略定位的话请加上此权限 -->

添加授权弹窗代码

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
  5. if (!isTaskRoot()) {
  6. // Android launched another instance of the root activity into an existing task
  7. // so just quietly finish and go away, dropping the user back into the activity
  8. // at the top of the stack (ie: the last state of this task)
  9. // Don't need to finish it again since it's finished in super.onCreate .
  10. return;
  11. }
  12. instance = this;
  13. //这里以ACCESS_COARSE_LOCATION为例
  14. if (AppActivity.instance.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
  15. != PackageManager.PERMISSION_GRANTED) {
  16. //申请WRITE_EXTERNAL_STORAGE权限
  17. AppActivity.instance.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
  18. GPSUtils.getInstance().LOCATION_CODE);//自定义的code 随便填一个数
  19. } else {
  20. // 用户以授权定位信息
  21. }
  22. }
  23. // 授权回调。询问是否同意授权的时候,系统会弹出对话框,我们选择之后,会进行回调。在回调里面进行判断。
  24. @Override
  25. public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  26. switch (requestCode) {
  27. case GPSUtils.LOCATION_CODE: {
  28. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  29. // 权限被用户同意。
  30. // 执形我们想要的操作
  31. GPSUtils.getInstance().province = GPSUtils.getInstance().getProvince();
  32. } else {
  33. Log.i("GPS", "未授权定位权限");
  34. // 用户授权定位信息
  35. }
  36. }
  37. case GPSUtils.OPEN_GPS_CODE: {
  38. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  39. // 权限被用户同意。
  40. // 执形我们想要的操作
  41. GPSUtils.getInstance().province = GPSUtils.getInstance().getProvince();
  42. } else {
  43. Log.i("GPS", "未授权定位权限");
  44. // 用户授权定位信息
  45. }
  46. }
  47. }
  48. }

第二步 获取 默认Android GPS定位实例

通过实例获取 Lacation 得到 经纬度 

这边

  1. LocationManager locationManager = (LocationManager) AppActivity.instance.getSystemService(Context.LOCATION_SERVICE); // 默认Android GPS定位实例
  2. Location location = null;
  3. // 是否已经授权
  4. if (AppActivity.instance.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
  5. == PackageManager.PERMISSION_GRANTED)
  6. {
  7. //判断GPS是否开启,没有开启,则开启
  8. // if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
  9. // //跳转到手机打开GPS页面
  10. // Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  11. // //设置完成后返回原来的界面
  12. // AppActivity.instance.startActivityForResult(intent,OPEN_GPS_CODE);
  13. // }
  14. //
  15. // location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); // GPS芯片定位 需要开启GPS
  16. // location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); // 利用网络定位 需要开启GPS
  17. location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); // 其他应用使用定位更新了定位信息 需要开启GPS
  18. }
  19. String p = "";
  20. if(location != null)
  21. {
  22. Log.i("GPS: ", "获取位置信息成功");
  23. Log.i("GPS: ","经度:" + location.getLatitude());
  24. Log.i("GPS: ","纬度:" + location.getLongitude());
  25. }
  26. else
  27. {
  28. Log.i("GPS: ", "获取位置信息失败");
  29. }

第三步 通过位置经纬获取国家地区

  1. /*
  2. * 根据经度纬度 获取国家,省份
  3. * */
  4. public String getAddress(double latitude, double longitude) {
  5. String cityName = "";
  6. List<Address> addList = null;
  7. Geocoder ge = new Geocoder(AppActivity.instance);
  8. try {
  9. addList = ge.getFromLocation(latitude, longitude, 1);
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. if (addList != null && addList.size() > 0) {
  14. for (int i = 0; i < addList.size(); i++) {
  15. Address ad = addList.get(i);
  16. Log.i("GPS 国家: ", ad.getCountryName());
  17. Log.i("GPS: 省份", ad.getAdminArea());
  18. Log.i("GPS: 详细地址", ad.getFeatureName());
  19. cityName += ad.getCountryName() + " " + ad.getLocality();
  20. }
  21. }
  22. return cityName;
  23. }

搞定。

下面是我写了个工具类

  1. package org.cocos2dx.javascript;
  2. import android.annotation.TargetApi;
  3. import android.content.Context;
  4. import android.location.Address;
  5. import android.location.Geocoder;
  6. import android.location.Location;
  7. import android.location.LocationManager;
  8. import android.os.Build;
  9. import android.util.Log;
  10. import java.io.IOException;
  11. import java.util.List;
  12. import android.Manifest;
  13. import android.content.pm.PackageManager;
  14. /**
  15. * Created by Administrator on 2018/4/17.
  16. * 获取用户的地理位置
  17. */
  18. public class GPSUtils {
  19. private static GPSUtils instance;
  20. private LocationManager locationManager;
  21. public static final int LOCATION_CODE = 1000;
  22. public static final int OPEN_GPS_CODE = 1001;
  23. public String province = "";
  24. public static GPSUtils getInstance() {
  25. if (instance == null) {
  26. instance = new GPSUtils();
  27. }
  28. return instance;
  29. }
  30. @TargetApi(Build.VERSION_CODES.M)
  31. public String getProvince() {
  32. Log.i("GPS: ", "getProvince");
  33. locationManager = (LocationManager) AppActivity.instance.getSystemService(Context.LOCATION_SERVICE); // 默认Android GPS定位实例
  34. Location location = null;
  35. // 是否已经授权
  36. if (AppActivity.instance.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
  37. == PackageManager.PERMISSION_GRANTED)
  38. {
  39. //判断GPS是否开启,没有开启,则开启
  40. // if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
  41. // //跳转到手机打开GPS页面
  42. // Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  43. // //设置完成后返回原来的界面
  44. // AppActivity.instance.startActivityForResult(intent,OPEN_GPS_CODE);
  45. // }
  46. //
  47. // location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); // GPS芯片定位 需要开启GPS
  48. // location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); // 利用网络定位 需要开启GPS
  49. location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); // 其他应用使用定位更新了定位信息 需要开启GPS
  50. }
  51. String p = "";
  52. if(location != null)
  53. {
  54. Log.i("GPS: ", "获取位置信息成功");
  55. Log.i("GPS: ","经度:" + location.getLatitude());
  56. Log.i("GPS: ","纬度:" + location.getLongitude());
  57. // 获取地址信息
  58. p = getAddress(location.getLatitude(),location.getLongitude());
  59. Log.i("GPS: ","location:" + p);
  60. }
  61. else
  62. {
  63. Log.i("GPS: ", "获取位置信息失败,请检查是够开启GPS,是否授权");
  64. }
  65. return p;
  66. }
  67. /*
  68. * 根据经度纬度 获取国家,省份
  69. * */
  70. public String getAddress(double latitude, double longitude) {
  71. String cityName = "";
  72. List<Address> addList = null;
  73. Geocoder ge = new Geocoder(AppActivity.instance);
  74. try {
  75. addList = ge.getFromLocation(latitude, longitude, 1);
  76. } catch (IOException e) {
  77. e.printStackTrace();
  78. }
  79. if (addList != null && addList.size() > 0) {
  80. for (int i = 0; i < addList.size(); i++) {
  81. Address ad = addList.get(i);
  82. cityName += ad.getCountryName() + " " + ad.getLocality();
  83. }
  84. }
  85. return cityName;
  86. }
  87. }

调用  getProvince() 运行结果

 加餐篇

 选择Location Provider:
Android系统存在多种provider,分别是

GPS_PROVIDER:
这个就是手机里有GPS芯片,然后利用该芯片就能利用卫星获得自己的位置信息。但是在室内,GPS定位基本没用,很难定位的到。

NETWORK_PROVIDER:
这个就是利用网络定位,通常是利用手机基站和WIFI节点的地址来大致定位位置,这种定位方式取决于服务器,即取决于将基站或WIF节点信息翻译成位置信息的服务器的能力。由于目前大部分Android手机没有安装google官方的location manager库,大陆网络也不允许,即没有服务器来做这个事情,自然该方法基本上没法实现定位。

PASSIVE_PROVIDER:
被动定位方式,这个意思也比较明显,就是用现成的,当其他应用使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取就可以了。比如如果系统中已经安装了百度地图,高德地图(室内可以实现精确定位),你只要使用它们定位过后,再使用这种方法在你的程序肯定是可以拿到比较精确的定位信息。用户可以直接指定某一个provider
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/285145
推荐阅读
相关标签