一:百度地圖
說明:
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 }