zoukankan      html  css  js  c++  java
  • 地图应用之 :获取当前位置的经纬度

     

    一:百度地图

    说明:

    1. 设置定位的模式是 LocationMode.Hight_Accuracy 时,在室内可能无法获取到准确的经纬度,会得到默认的值是4.9E-324

        处理办法是将模式改为Battery_Saving,或到室外

    2.可以根据当前设备网络连接情况和GPS是否开启来设定定位模式

       //获得网络连接情况

              ConnectivityManager cManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

             NetworkInfo info = cManager.getActiveNetworkInfo();

       //获取GPS的连接情况
            LocationManager lManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
         if(lManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
                   Toast.makeText(this, "GPS已开启", 0).show();
             }

     

    3.使用经纬度要在public void onReceiveLocation(BDLocation loc) {}方法中操作

     

    步骤一:导入百度定位SDK包,以下包中,定位只需要BaiduLBS_Android.jar包

     

    第二部:在AndroidManifest.xml清单文件中添加访问权限和服务等,代码如下:

    复制代码
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.qf.location"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6 
     7     <uses-sdk
     8         android:minSdkVersion="8"
     9         android:targetSdkVersion="18" />
    10     
    11     <!-- 添加的内容 1 (访问权限) -->
    12    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    13     <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    14     <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    15     <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
    16     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    17     <uses-permission android:name="android.permission.INTERNET" />
    18     <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    19     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    20     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    21     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    22     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    23     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    24     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    25     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    26     <!-- 这个权限用于进行网络定位 -->
    27     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    28     </uses-permission>
    29     <!-- 这个权限用于访问GPS定位 -->
    30     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    31     </uses-permission>
    32     <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    33     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    34     </uses-permission>
    35     <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
    36     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    37     </uses-permission>
    38     <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    39     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    40     </uses-permission>
    41     <!-- 用于读取手机当前的状态 -->
    42     <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    43     </uses-permission>
    44     <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
    45     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    46     </uses-permission>
    47     <!-- 访问网络,网络定位需要上网 -->
    48     <uses-permission android:name="android.permission.INTERNET" />
    49     <!-- SD卡读取权限,用户写入离线定位数据 -->
    50     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
    51     </uses-permission>
    52     <!-- 允许应用读取低级别的系统日志文件 -->
    53     <uses-permission android:name="android.permission.READ_LOGS" >
    54     </uses-permission>
    55     
    56     <application
    57         android:allowBackup="true"
    58         android:icon="@drawable/ic_launcher"
    59         android:label="@string/app_name"
    60         android:theme="@style/AppTheme" >
    61         <activity
    62             android:name="com.qf.location.MainActivity"
    63             android:label="@string/app_name" >
    64             <intent-filter>
    65                 <action android:name="android.intent.action.MAIN" />
    66 
    67                 <category android:name="android.intent.category.LAUNCHER" />
    68             </intent-filter>
    69         </activity>
    70         
    71         <!-- 添加的内容 2 -->
    72          <meta-data
    73             android:name="com.baidu.lbsapi.API_KEY"
    74             android:value="Dt7Q30nVQMKbM3NT6GHnRnGq" />
    75 
    76         <service
    77             android:name="com.baidu.location.f"
    78             android:enabled="true"
    79             android:process=":remote" >
    80         </service>
    81     </application>
    82  
    83 </manifest>
    复制代码

    第三步: 申请 百度地图开发密钥:在上步中显示的<meta_data >标签的value属性上设置

    第四步:写代码获取当前位置经纬度:代码如下:

    复制代码
     1 private LocationClient locClient;
     2     
     3     @Override
     4     protected void onCreate(Bundle savedInstanceState) {
     5         super.onCreate(savedInstanceState);
     6         
     7         //显示界面之前初始化 BaiduMap SDK
     8         SDKInitializer.initialize(getApplicationContext());
     9         setContentView(R.layout.activity_main);
    10         
    11   
    12         getLocation();
    13     }
    14    
    15 
    16      //获取手机当前所在位置的经纬度
    17     public void  getLocation(){
    18         //实例化位置客户端
    19         locClient = new LocationClient(getApplicationContext());
    20         //创建一个位置option对象
    21         LocationClientOption locOption = new LocationClientOption();
    22         
    23         //设置option的属性
    24         locOption.setCoorType("bd09II");  // bd09II表示返回的结果是百度的经纬度
    25         locOption.setIsNeedAddress(true); //返回的信息包含当前的地址
    26         locOption.setNeedDeviceDirect(true); //返回的内容包含手机机头的方向
    27         locOption.setScanSpan(5000); //每5秒发起一次定位请求
    28         locOption.setLocationMode(LocationMode.Hight_Accuracy); //高精度模式,网络和GPS
    29         
    30         
    31         //将封装的参数设置到位置客户端
    32         locClient.setLocOption(locOption);
    33         
    34         //给位置客户端注册位置监听器
    35         locClient.registerLocationListener(new BDLocationListener() {
    36             
    37             @Override
    38             public void onReceiveLocation(BDLocation loc) {
    39               double latitude = loc.getLatitude();
    40               double longitude = loc.getLongitude();
    41               Toast.makeText(getApplicationContext(), latitude+":"+longitude, 0).show();
    42               
    43               /*================================此处定义接口=====================*/
    44                 
    45             } 
    46         });
    47         
    48         //启动位置客户端
    49         locClient.start();
    50         
    51     }
    复制代码

     

     

    二. 高德地图

    说明:高德地图提供了三种定位模式,下面以混合模式为例,

     

    注册监听的方法为 requestLocationData(String provider, long minTime, float minDistance, AMapLocationListener listener) 方法,其中参数:

     

    • provider:有三种定位Provider供用户选择,分别是:LocationManagerProxy.GPS_PROVIDER,代表使用手机GPS定位;LocationManagerProxy.NETWORK_PROVIDER,代表使用手机网络定位;LocationProviderProxy.AMapNetwork,代表高德网络定位服务,混合定位。
    • minTime:位置变化的通知时间,单位为毫秒。如果为-1,定位只定位一次。
    • minDistance:位置变化通知距离,单位为米。
    • listener:定位监听者。

     

    步骤一:将高德定位包拷贝到libs目录下

    步骤二:在AndroidManifest.xml文件中添加相应的内容

    复制代码
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.don.amaplocationdemotest"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6 
     7     <uses-sdk
     8         android:minSdkVersion="8"
     9         android:targetSdkVersion="18" />
    10     
    11     <!-- 添加内容1 :访问权限 -->
    12     <uses-permission android:name="android.permission.INTERNET" />
    13     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    14     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    15     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    16     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    17     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    18     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    19     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    20     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    21     <uses-permission android:name="android.permission.WAKE_LOCK" />
    22     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    23     
    24 
    25     <application
    26         android:allowBackup="true"
    27         android:icon="@drawable/ic_launcher"
    28         android:label="@string/app_name"
    29         android:theme="@style/AppTheme" >
    30         
    31          <!-- 添加内容2 -->
    32        <meta-data
    33             android:name="com.amap.api.v2.apikey"
    34             android:value="b772627bc616d5bf0b4f9371807cd60a" />
    35        
    36         <activity
    37             android:name="com.don.amaplocationdemotest.MainActivity"
    38             android:label="@string/app_name" >
    39             <intent-filter>
    40                 <action android:name="android.intent.action.MAIN" />
    41 
    42                 <category android:name="android.intent.category.LAUNCHER" />
    43             </intent-filter>
    44         </activity>
    45         <activity
    46             android:name="com.don.amaplocationdemotest.MNetLocationActivity"
    47             android:label="@string/title_activity_mnet_location" >
    48         </activity>
    49         <activity
    50             android:name="com.don.amaplocationdemotest.MGpsLocationActivity"
    51             android:label="@string/title_activity_mnet_location" >
    52         </activity>
    53         <activity
    54             android:name="com.don.amaplocationdemotest.MMultyLocationActivity"
    55             android:label="@string/title_activity_mnet_location" >
    56         </activity>
    57     </application>
    58 
    59 </manifest>
    复制代码

    步骤三:在官网申请key,添加到步骤二的清单文件中

    步骤四:编写代码

    复制代码
      1 package com.don.amaplocationdemotest;
      2 
      3 import android.app.Activity;
      4 import android.location.Location;
      5 import android.os.Bundle;
      6 import android.os.Handler;
      7 import android.os.Message;
      8 import android.view.Window;
      9 import android.widget.TextView;
     10 
     11 import com.amap.api.location.AMapLocation;
     12 import com.amap.api.location.AMapLocationListener;
     13 import com.amap.api.location.LocationManagerProxy;
     14 import com.amap.api.location.LocationProviderProxy;
     15 
     16 public class MMultyLocationActivity extends Activity implements
     17         AMapLocationListener {
     18     private LocationManagerProxy locationManagerProxy;
     19     private TextView latitude_txt; // 纬度
     20     private TextView longitude_txt; // 经度
     21     private TextView address_txt; // 地址信息
     22     private Handler handler = new Handler() {
     23         public void handleMessage(android.os.Message msg) {
     24             if (msg != null) {
     25                 AMapLocation loc = (AMapLocation) msg.obj;
     26                 latitude_txt.setText("纬度:" + loc.getLatitude());
     27                 longitude_txt.setText("经度:" + loc.getLongitude());
     28                 address_txt.setText("地址信息:" + loc.getAddress());
     29 
     30             }
     31 
     32         };
     33 
     34     };
     35 
     36     @Override
     37     protected void onCreate(Bundle savedInstanceState) {
     38         super.onCreate(savedInstanceState);
     39         requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置没有标题栏
     40         setContentView(R.layout.activity_mmulty_location);
     41         init();
     42         initView();
     43     }
     44 
     45     public void init() {
     46         locationManagerProxy = LocationManagerProxy.getInstance(this);
     47         locationManagerProxy.setGpsEnable(false);
     48         locationManagerProxy.requestLocationData(
     49                 LocationProviderProxy.AMapNetwork, 30 * 1000, 10, this);
     50     }
     51 
     52     public void initView() {
     53         latitude_txt = (TextView) findViewById(R.id.mutxt_latitude);
     54         longitude_txt = (TextView) findViewById(R.id.mutxt_longitude);
     55         address_txt = (TextView) findViewById(R.id.mutxt_address);
     56 
     57     }
     58 
     59     @Override
     60     public void onLocationChanged(AMapLocation aMapLocation) {
     61         if (aMapLocation != null
     62                 && aMapLocation.getAMapException().getErrorCode() == 0) {
     63             Message msg = Message.obtain(handler, 0, aMapLocation);
     64             handler.sendMessage(msg);
     65         }
     66     }
     67 
     68     @Override
     69     public void onLocationChanged(Location arg0) {
     70         // TODO Auto-generated method stub
     71 
     72     }
     73 
     74     @Override
     75     public void onProviderDisabled(String arg0) {
     76         // TODO Auto-generated method stub
     77 
     78     }
     79 
     80     @Override
     81     public void onProviderEnabled(String arg0) {
     82         // TODO Auto-generated method stub
     83 
     84     }
     85 
     86     @Override
     87     public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
     88         // TODO Auto-generated method stub
     89 
     90     }
     91 
     92     @Override
     93     protected void onPause() {
     94         super.onPause();
     95         // 移除定位请求
     96         locationManagerProxy.removeUpdates(this);
     97         // 销毁定位
     98         locationManagerProxy.destroy();
     99     }
    100 
    101 }
    复制代码

     

  • 相关阅读:
    ES6语法:var、let、const的区别详解
    idea新建springboot项目
    Serlvet之cookie和session学习
    常见排序算法
    Spring MVC拦截器学习
    分组数据
    redis数据库学习
    redis实现排行榜
    redis整合springboot的helloworld
    dubbo整合springboot最详细入门教程
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317790.html
Copyright © 2011-2022 走看看