Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android百度地圖之定位SDK(v3.1)使用示例(一)

Android百度地圖之定位SDK(v3.1)使用示例(一)

編輯:Android開發實例

一、使用百度提供的地圖定位服務所需資源:

在百度官網,下載百度地圖定位SDK(Android版),在裡面找liblocSDK3.so和locSDK_3.1.jar這兩個文件。

下載地址:http://developer.baidu.com/map/geosdk-android-download.htm

二、搭建環境:

  1、將liblocSDK3.so文件拷貝到libs/armeabi目錄下,將locSDK3.1.jar文件拷貝到libs目錄下,並將locSDK3.1.jar導入到工程中。如下圖:

   2、修改AndroidManifest.xml文件:

         a. 在application標簽中聲明service組件

  1. <service 
  2.     android:enabled="true" 
  3.     android:name="com.baidu.location.f" 
  4.     android:process=":remote" /> 

         b. 聲明所需權限 

  1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
  2. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
  4. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
  5. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
  6. <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
  7. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
  8. <uses-permission android:name="android.permission.INTERNET" /> 
  9. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
  10. <uses-permission android:name="android.permission.READ_LOGS" /> 

三、具體實現:

   1、構建LocationClient類的對象,設置定位參數,並注冊實現了BDLocationListener接口的類的對象為監聽器。

  1. mLocationClient = new LocationClient(this.getApplicationContext());  
  2.  
  3. mBDLocationListener = new MyBDLocationListener();  
  4. mLocationClient.registerLocationListener(mBDLocationListener);  
  5.  
  6. LocationClientOption option = new LocationClientOption();  
  7.  
  8. // 需要地址信息,設置為其他任何值(string類型,且不能為null)時,都表示無地址信息。  
  9. option.setAddrType("all");  
  10. // 設置是否返回POI的電話和地址等詳細信息。默認值為false,即不返回POI的電話和地址信息。   
  11. option.setPoiExtraInfo(true);  
  12.  
  13. // 設置產品線名稱。強烈建議您使用自定義的產品線名稱,方便我們以後為您提供更高效准確的定位服務。   
  14. option.setProdName("定位我當前的位置");  
  15.  
  16. // 打開GPS,使用gps前提是用戶硬件打開gps。默認是不打開gps的。   
  17. option.setOpenGps(false);  
  18.  
  19. // 定位的時間間隔,單位:ms  
  20. // 當所設的整數值大於等於1000(ms)時,定位SDK內部使用定時定位模式。  
  21. // option.setScanSpan(1000);  
  22.  
  23. // 查詢范圍,默認值為500,即以當前定位位置為中心的半徑大小。  
  24. option.setPoiDistance(500);  
  25. // 禁用啟用緩存定位數據  
  26. option.disableCache(true);  
  27.  
  28. // 坐標系類型,百度手機地圖對外接口中的坐標系默認是bd09ll  
  29. option.setCoorType("bd09ll");  
  30.  
  31. // 設置最多可返回的POI個數,默認值為3。由於POI查詢比較耗費流量,設置最多返回的POI個數,以便節省流量。  
  32. option.setPoiNumber(3);  
  33.  
  34. // 設置定位方式的優先級。  
  35. // 即使有GPS,而且可用,也仍舊會發起網絡請求。這個選項適合對精確坐標不是特別敏感,但是希望得到位置描述的用戶。  
  36. option.setPriority(LocationClientOption.NetWorkFirst);  
  37.  
  38. mLocationClient.setLocOption(option);  

      2、發起請求:

  1. // 發起定位請求  
  2.        findViewById(R.id.btn_request).setOnClickListener(new View.OnClickListener() {  
  3.           
  4.         @Override 
  5.         public void onClick(View v) {  
  6.              mLocationClient.start();  
  7.         }  
  8.     });  
  9.          
  10.        // 發起重新定位  
  11.         findViewById(R.id.btn_location).setOnClickListener(new View.OnClickListener() {  
  12.           
  13.         @Override 
  14.         public void onClick(View v) {  
  15.             if (mLocationClient != null && mLocationClient.isStarted()){  
  16.                 mLocationClient.requestLocation();  
  17.             }  
  18.         }  
  19.     });  
  20.          
  21.         // 發起查詢請求  
  22.         findViewById(R.id.btn_address).setOnClickListener(new View.OnClickListener() {  
  23.               
  24.             @Override 
  25.             public void onClick(View v) {  
  26.                 if (mLocationClient != null && mLocationClient.isStarted()){  
  27.                    mLocationClient.requestPoi();  
  28.                 }  
  29.             }  
  30.         });   

      3、 編寫BDLocationListener接口的實現類,接收異步返回的定位結果和異步返回的POI查詢結果。

  1. final class MyBDLocationListener implements BDLocationListener{  
  2.  
  3.     @Override 
  4.     public void onReceiveLocation(BDLocation location) {  
  5.         Log.e(TAG, "---------onReceiveLocation()---------");  
  6.           
  7.         if(location == null){  
  8.             Log.e(TAG, "---------onReceiveLocation------location is NULL----");  
  9.             return;  
  10.         }  
  11.           
  12.         int type = location.getLocType();  
  13.         Log.i(TAG, "當前定位采用的類型是:type = " + type);  
  14.           
  15.         String coorType = location.getCoorType();  
  16.         Log.i(TAG, "坐標系類型:coorType = " + coorType);  
  17.           
  18.            // 判斷是否有定位精度半徑  
  19.            if(location.hasRadius()){  
  20.             // 獲取定位精度半徑,單位是米  
  21.             float accuracy = location.getRadius();  
  22.             Log.i(TAG, "accuracy = " + accuracy);  
  23.            }  
  24.           
  25.            if(location.hasAddr()){  
  26.             // 獲取反地理編碼。 只有使用網絡定位的情況下,才能獲取當前位置的反地理編碼描述。  
  27.             String address = location.getAddrStr();  
  28.             Log.i(TAG, "address = " + address);  
  29.         }  
  30.              
  31.            String province = location.getProvince();  // 獲取省份信息  
  32.            String city = location.getCity();  // 獲取城市信息  
  33.            String district = location.getDistrict(); // 獲取區縣信息  
  34.              
  35.            Log.i(TAG, "province = " + province);  
  36.            Log.i(TAG, "city = " + city);  
  37.            Log.i(TAG, "district = " + district);  
  38.              
  39.            double latitude = location.getLatitude();  
  40.            double longitude = location.getLongitude();  
  41.            Log.i(TAG, "latitude = " + latitude);  
  42.            Log.i(TAG, "longitude = " + longitude);  
  43.           
  44.     }  
  45.  
  46.     @Override 
  47.     public void onReceivePoi(BDLocation poiLocation) {  
  48.           
  49.         Log.e(TAG, "---------onReceivePoi()---------");  
  50.           
  51.         if(poiLocation == null){  
  52.             Log.e(TAG, "---------onReceivePoi------location is NULL----");  
  53.             return;  
  54.         }  
  55.           
  56.         if(poiLocation.hasPoi()){  
  57.             String poiStr = poiLocation.getPoi();  
  58.             Log.i(TAG, "poiStr = " + poiStr);  
  59.               
  60.         }  
  61.           
  62.         if(poiLocation.hasAddr()){  
  63.             // 獲取反地理編碼。 只有使用網絡定位的情況下,才能獲取當前位置的反地理編碼描述。  
  64.             String address = poiLocation.getAddrStr();  
  65.             Log.i(TAG, "address = " + address);  
  66.         }  
  67.     }  
  68.    }  

      4、定位結束後停止服務:

  1. if(mLocationClient != null && mLocationClient.isStarted()){  
  2.             if(mBDLocationListener != null){  
  3.                 mLocationClient.unRegisterLocationListener(mBDLocationListener);  
  4.             }  
  5.               
  6.             mLocationClient.stop();  
  7.             mLocationClient = null;  
  8.         }  

四、運行效果圖:

1、在3G/2G網絡環境下:
點擊第一個按鈕,Logcat打印的日志如下:

點擊第二個按鈕,Logcat打印的日志如下:

點擊第二個按鈕,Logcat打印的日志如下:

點擊第三個按鈕,Logcat打印的日志如下:

點擊第三個按鈕,Logcat打印的日志如下:

點擊第三個按鈕,Logcat打印的日志如下:

2、在wifi環境下:

點擊第二個按鈕,Logcat打印的日志如下:

點擊第三個按鈕,Logcat打印的日志如下:


注:我是在房子裡面,也就是說:只能用WIFI或者3G/2G網絡粗略的確定我當前的位置信息。我用3G/2G網絡和WIFI都測過了,每次間隔要大於1秒。

通過上面的Logcat打印出的結果,我們大致可以得出這樣的結論:在WIFI或者3G/2G網絡只能粗略的確定我當前的位置信息。可能會差很大,也就是說不靠譜。

大家可以自己測測看,呵呵。

完整代碼:

  1. package com.android.baidu.map;  
  2.  
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7.  
  8. import com.baidu.location.BDLocation;  
  9. import com.baidu.location.BDLocationListener;  
  10. import com.baidu.location.LocationClient;  
  11. import com.baidu.location.LocationClientOption;  
  12.  
  13. /**  
  14.  * 獲取我當前的位置信息。  
  15.  * 對精確坐標不是特別敏感,但是希望得到位置描述。  
  16.  * @author android_ls  
  17.  *  
  18.  */ 
  19. public class BaiduMapLoactionActivity extends Activity {  
  20.      
  21.     private static final String TAG = "BaiduMapLoactionActivity";  
  22.       
  23.     private LocationClient mLocationClient;  
  24.       
  25.     private MyBDLocationListener mBDLocationListener;  
  26.       
  27.     @Override 
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.           
  32.         mLocationClient = new LocationClient(this.getApplicationContext());  
  33.           
  34.         mBDLocationListener = new MyBDLocationListener();  
  35.         mLocationClient.registerLocationListener(mBDLocationListener);  
  36.           
  37.         LocationClientOption option = new LocationClientOption();  
  38.          
  39.         // 需要地址信息,設置為其他任何值(string類型,且不能為null)時,都表示無地址信息。  
  40.         option.setAddrType("all");  
  41.         // 設置是否返回POI的電話和地址等詳細信息。默認值為false,即不返回POI的電話和地址信息。   
  42.         option.setPoiExtraInfo(true);  
  43.           
  44.         // 設置產品線名稱。強烈建議您使用自定義的產品線名稱,方便我們以後為您提供更高效准確的定位服務。   
  45.         option.setProdName("定位我當前的位置");  
  46.           
  47.         // 打開GPS,使用gps前提是用戶硬件打開gps。默認是不打開gps的。   
  48.         option.setOpenGps(false);  
  49.           
  50.         // 定位的時間間隔,單位:ms  
  51.         // 當所設的整數值大於等於1000(ms)時,定位SDK內部使用定時定位模式。  
  52.         // option.setScanSpan(1000);  
  53.           
  54.         // 查詢范圍,默認值為500,即以當前定位位置為中心的半徑大小。  
  55.         option.setPoiDistance(500);  
  56.         // 禁用啟用緩存定位數據  
  57.         option.disableCache(true);  
  58.           
  59.         // 坐標系類型,百度手機地圖對外接口中的坐標系默認是bd09ll  
  60.         option.setCoorType("bd09ll");  
  61.           
  62.         // 設置最多可返回的POI個數,默認值為3。由於POI查詢比較耗費流量,設置最多返回的POI個數,以便節省流量。  
  63.         option.setPoiNumber(3);  
  64.           
  65.         // 設置定位方式的優先級。  
  66.         // 即使有GPS,而且可用,也仍舊會發起網絡請求。這個選項適合對精確坐標不是特別敏感,但是希望得到位置描述的用戶。  
  67.         option.setPriority(LocationClientOption.NetWorkFirst);  
  68.           
  69.         mLocationClient.setLocOption(option);  
  70.           
  71.         // 發起定位請求  
  72.         findViewById(R.id.btn_request).setOnClickListener(new View.OnClickListener() {  
  73.               
  74.             @Override 
  75.             public void onClick(View v) {  
  76.                  mLocationClient.start();  
  77.             }  
  78.         });  
  79.           
  80.         // 發起重新定位  
  81.          findViewById(R.id.btn_location).setOnClickListener(new View.OnClickListener() {  
  82.               
  83.             @Override 
  84.             public void onClick(View v) {  
  85.                 if (mLocationClient != null && mLocationClient.isStarted()){  
  86.                     mLocationClient.requestLocation();  
  87.                 }  
  88.             }  
  89.         });  
  90.           
  91.          // 發起查詢請求  
  92.          findViewById(R.id.btn_address).setOnClickListener(new View.OnClickListener() {  
  93.               
  94.             @Override 
  95.             public void onClick(View v) {  
  96.                 if (mLocationClient != null && mLocationClient.isStarted()){  
  97.                    mLocationClient.requestPoi();  
  98.                 }  
  99.             }  
  100.         });   
  101.            
  102.     }  
  103.       
  104.     final class MyBDLocationListener implements BDLocationListener{  
  105.  
  106.         @Override 
  107.         public void onReceiveLocation(BDLocation location) {  
  108.             Log.e(TAG, "---------onReceiveLocation()---------");  
  109.               
  110.             if(location == null){  
  111.                 Log.e(TAG, "---------onReceiveLocation------location is NULL----");  
  112.                 return;  
  113.             }  
  114.               
  115.             int type = location.getLocType();  
  116.             Log.i(TAG, "當前定位采用的類型是:type = " + type);  
  117.               
  118.             String coorType = location.getCoorType();  
  119.             Log.i(TAG, "坐標系類型:coorType = " + coorType);  
  120.               
  121.                // 判斷是否有定位精度半徑  
  122.             if(location.hasRadius()){  
  123.                 // 獲取定位精度半徑,單位是米  
  124.                 float accuracy = location.getRadius();  
  125.                 Log.i(TAG, "accuracy = " + accuracy);  
  126.             }  
  127.               
  128.             if(location.hasAddr()){  
  129.                 // 獲取反地理編碼。 只有使用網絡定位的情況下,才能獲取當前位置的反地理編碼描述。  
  130.                 String address = location.getAddrStr();  
  131.                 Log.i(TAG, "address = " + address);  
  132.             }  
  133.               
  134.             String province = location.getProvince();  // 獲取省份信息  
  135.             String city = location.getCity();  // 獲取城市信息  
  136.             String district = location.getDistrict(); // 獲取區縣信息  
  137.               
  138.             Log.i(TAG, "province = " + province);  
  139.             Log.i(TAG, "city = " + city);  
  140.             Log.i(TAG, "district = " + district);  
  141.               
  142.             double latitude = location.getLatitude();  
  143.             double longitude = location.getLongitude();  
  144.             Log.i(TAG, "latitude = " + latitude);  
  145.             Log.i(TAG, "longitude = " + longitude);  
  146.               
  147.         }  
  148.  
  149.         @Override 
  150.         public void onReceivePoi(BDLocation poiLocation) {  
  151.               
  152.             Log.e(TAG, "---------onReceivePoi()---------");  
  153.               
  154.             if(poiLocation == null){  
  155.                 Log.e(TAG, "---------onReceivePoi------location is NULL----");  
  156.                 return;  
  157.             }  
  158.               
  159.             if(poiLocation.hasPoi()){  
  160.                 String poiStr = poiLocation.getPoi();  
  161.                 Log.i(TAG, "poiStr = " + poiStr);  
  162.                   
  163.             }  
  164.               
  165.             if(poiLocation.hasAddr()){  
  166.                 // 獲取反地理編碼。 只有使用網絡定位的情況下,才能獲取當前位置的反地理編碼描述。  
  167.                 String address = poiLocation.getAddrStr();  
  168.                 Log.i(TAG, "address = " + address);  
  169.             }  
  170.         }  
  171.     }  
  172.       
  173.     @Override 
  174.     protected void onDestroy() {  
  175.         if(mLocationClient != null && mLocationClient.isStarted()){  
  176.             if(mBDLocationListener != null){  
  177.                 mLocationClient.unRegisterLocationListener(mBDLocationListener);  
  178.             }  
  179.               
  180.             mLocationClient.stop();  
  181.             mLocationClient = null;  
  182.         }  
  183.           
  184.         super.onDestroy();  
  185.     }  
  186.       
  187. }  

 

轉自:http://blog.csdn.net/android_ls/article/details/8583437

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved