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

一:百度地图

说明:

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>
View Code

第三步: 申请 百度地图开发密钥:在上步中显示的<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     }
View Code

 

 

二. 高德地图

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

 

注册监听的方法为 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>
View Code

步骤三:在官网申请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 }
View Code

 

posted on 2014-11-18 20:52  畅遨  阅读(3706)  评论(0编辑  收藏  举报

导航