地图应用之 :获取当前位置的经纬度

来源:互联网 发布:华三交换机开启端口 编辑:程序博客网 时间:2024/05/18 01:03

 

一:百度地图

说明:

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     <application57         android:allowBackup="true"58         android:icon="@drawable/ic_launcher"59         android:label="@string/app_name"60         android:theme="@style/AppTheme" >61         <activity62             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-data73             android:name="com.baidu.lbsapi.API_KEY"74             android:value="Dt7Q30nVQMKbM3NT6GHnRnGq" />75 76         <service77             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); //高精度模式,网络和GPS29         30         31         //将封装的参数设置到位置客户端32         locClient.setLocOption(locOption);33         34         //给位置客户端注册位置监听器35         locClient.registerLocationListener(new BDLocationListener() {36             37             @Override38             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     <application26         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-data33             android:name="com.amap.api.v2.apikey"34             android:value="b772627bc616d5bf0b4f9371807cd60a" />35        36         <activity37             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         <activity46             android:name="com.don.amaplocationdemotest.MNetLocationActivity"47             android:label="@string/title_activity_mnet_location" >48         </activity>49         <activity50             android:name="com.don.amaplocationdemotest.MGpsLocationActivity"51             android:label="@string/title_activity_mnet_location" >52         </activity>53         <activity54             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 }
复制代码

 

0 0