編輯: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組件
- <service
- android:enabled="true"
- android:name="com.baidu.location.f"
- android:process=":remote" />
b. 聲明所需權限
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
- <uses-permission android:name="android.permission.READ_LOGS" />
三、具體實現:
1、構建LocationClient類的對象,設置定位參數,並注冊實現了BDLocationListener接口的類的對象為監聽器。
- mLocationClient = new LocationClient(this.getApplicationContext());
- mBDLocationListener = new MyBDLocationListener();
- mLocationClient.registerLocationListener(mBDLocationListener);
- LocationClientOption option = new LocationClientOption();
- // 需要地址信息,設置為其他任何值(string類型,且不能為null)時,都表示無地址信息。
- option.setAddrType("all");
- // 設置是否返回POI的電話和地址等詳細信息。默認值為false,即不返回POI的電話和地址信息。
- option.setPoiExtraInfo(true);
- // 設置產品線名稱。強烈建議您使用自定義的產品線名稱,方便我們以後為您提供更高效准確的定位服務。
- option.setProdName("定位我當前的位置");
- // 打開GPS,使用gps前提是用戶硬件打開gps。默認是不打開gps的。
- option.setOpenGps(false);
- // 定位的時間間隔,單位:ms
- // 當所設的整數值大於等於1000(ms)時,定位SDK內部使用定時定位模式。
- // option.setScanSpan(1000);
- // 查詢范圍,默認值為500,即以當前定位位置為中心的半徑大小。
- option.setPoiDistance(500);
- // 禁用啟用緩存定位數據
- option.disableCache(true);
- // 坐標系類型,百度手機地圖對外接口中的坐標系默認是bd09ll
- option.setCoorType("bd09ll");
- // 設置最多可返回的POI個數,默認值為3。由於POI查詢比較耗費流量,設置最多返回的POI個數,以便節省流量。
- option.setPoiNumber(3);
- // 設置定位方式的優先級。
- // 即使有GPS,而且可用,也仍舊會發起網絡請求。這個選項適合對精確坐標不是特別敏感,但是希望得到位置描述的用戶。
- option.setPriority(LocationClientOption.NetWorkFirst);
- mLocationClient.setLocOption(option);
2、發起請求:
- // 發起定位請求
- findViewById(R.id.btn_request).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mLocationClient.start();
- }
- });
- // 發起重新定位
- findViewById(R.id.btn_location).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mLocationClient != null && mLocationClient.isStarted()){
- mLocationClient.requestLocation();
- }
- }
- });
- // 發起查詢請求
- findViewById(R.id.btn_address).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mLocationClient != null && mLocationClient.isStarted()){
- mLocationClient.requestPoi();
- }
- }
- });
3、 編寫BDLocationListener接口的實現類,接收異步返回的定位結果和異步返回的POI查詢結果。
- final class MyBDLocationListener implements BDLocationListener{
- @Override
- public void onReceiveLocation(BDLocation location) {
- Log.e(TAG, "---------onReceiveLocation()---------");
- if(location == null){
- Log.e(TAG, "---------onReceiveLocation------location is NULL----");
- return;
- }
- int type = location.getLocType();
- Log.i(TAG, "當前定位采用的類型是:type = " + type);
- String coorType = location.getCoorType();
- Log.i(TAG, "坐標系類型:coorType = " + coorType);
- // 判斷是否有定位精度半徑
- if(location.hasRadius()){
- // 獲取定位精度半徑,單位是米
- float accuracy = location.getRadius();
- Log.i(TAG, "accuracy = " + accuracy);
- }
- if(location.hasAddr()){
- // 獲取反地理編碼。 只有使用網絡定位的情況下,才能獲取當前位置的反地理編碼描述。
- String address = location.getAddrStr();
- Log.i(TAG, "address = " + address);
- }
- String province = location.getProvince(); // 獲取省份信息
- String city = location.getCity(); // 獲取城市信息
- String district = location.getDistrict(); // 獲取區縣信息
- Log.i(TAG, "province = " + province);
- Log.i(TAG, "city = " + city);
- Log.i(TAG, "district = " + district);
- double latitude = location.getLatitude();
- double longitude = location.getLongitude();
- Log.i(TAG, "latitude = " + latitude);
- Log.i(TAG, "longitude = " + longitude);
- }
- @Override
- public void onReceivePoi(BDLocation poiLocation) {
- Log.e(TAG, "---------onReceivePoi()---------");
- if(poiLocation == null){
- Log.e(TAG, "---------onReceivePoi------location is NULL----");
- return;
- }
- if(poiLocation.hasPoi()){
- String poiStr = poiLocation.getPoi();
- Log.i(TAG, "poiStr = " + poiStr);
- }
- if(poiLocation.hasAddr()){
- // 獲取反地理編碼。 只有使用網絡定位的情況下,才能獲取當前位置的反地理編碼描述。
- String address = poiLocation.getAddrStr();
- Log.i(TAG, "address = " + address);
- }
- }
- }
4、定位結束後停止服務:
- if(mLocationClient != null && mLocationClient.isStarted()){
- if(mBDLocationListener != null){
- mLocationClient.unRegisterLocationListener(mBDLocationListener);
- }
- mLocationClient.stop();
- mLocationClient = null;
- }
四、運行效果圖:
1、在3G/2G網絡環境下:
點擊第一個按鈕,Logcat打印的日志如下:
點擊第二個按鈕,Logcat打印的日志如下:
點擊第二個按鈕,Logcat打印的日志如下:
點擊第三個按鈕,Logcat打印的日志如下:
點擊第三個按鈕,Logcat打印的日志如下:
點擊第三個按鈕,Logcat打印的日志如下:
2、在wifi環境下:
點擊第二個按鈕,Logcat打印的日志如下:
點擊第三個按鈕,Logcat打印的日志如下:
注:我是在房子裡面,也就是說:只能用WIFI或者3G/2G網絡粗略的確定我當前的位置信息。我用3G/2G網絡和WIFI都測過了,每次間隔要大於1秒。
通過上面的Logcat打印出的結果,我們大致可以得出這樣的結論:在WIFI或者3G/2G網絡只能粗略的確定我當前的位置信息。可能會差很大,也就是說不靠譜。
大家可以自己測測看,呵呵。
完整代碼:
- package com.android.baidu.map;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import com.baidu.location.BDLocation;
- import com.baidu.location.BDLocationListener;
- import com.baidu.location.LocationClient;
- import com.baidu.location.LocationClientOption;
- /**
- * 獲取我當前的位置信息。
- * 對精確坐標不是特別敏感,但是希望得到位置描述。
- * @author android_ls
- *
- */
- public class BaiduMapLoactionActivity extends Activity {
- private static final String TAG = "BaiduMapLoactionActivity";
- private LocationClient mLocationClient;
- private MyBDLocationListener mBDLocationListener;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mLocationClient = new LocationClient(this.getApplicationContext());
- mBDLocationListener = new MyBDLocationListener();
- mLocationClient.registerLocationListener(mBDLocationListener);
- LocationClientOption option = new LocationClientOption();
- // 需要地址信息,設置為其他任何值(string類型,且不能為null)時,都表示無地址信息。
- option.setAddrType("all");
- // 設置是否返回POI的電話和地址等詳細信息。默認值為false,即不返回POI的電話和地址信息。
- option.setPoiExtraInfo(true);
- // 設置產品線名稱。強烈建議您使用自定義的產品線名稱,方便我們以後為您提供更高效准確的定位服務。
- option.setProdName("定位我當前的位置");
- // 打開GPS,使用gps前提是用戶硬件打開gps。默認是不打開gps的。
- option.setOpenGps(false);
- // 定位的時間間隔,單位:ms
- // 當所設的整數值大於等於1000(ms)時,定位SDK內部使用定時定位模式。
- // option.setScanSpan(1000);
- // 查詢范圍,默認值為500,即以當前定位位置為中心的半徑大小。
- option.setPoiDistance(500);
- // 禁用啟用緩存定位數據
- option.disableCache(true);
- // 坐標系類型,百度手機地圖對外接口中的坐標系默認是bd09ll
- option.setCoorType("bd09ll");
- // 設置最多可返回的POI個數,默認值為3。由於POI查詢比較耗費流量,設置最多返回的POI個數,以便節省流量。
- option.setPoiNumber(3);
- // 設置定位方式的優先級。
- // 即使有GPS,而且可用,也仍舊會發起網絡請求。這個選項適合對精確坐標不是特別敏感,但是希望得到位置描述的用戶。
- option.setPriority(LocationClientOption.NetWorkFirst);
- mLocationClient.setLocOption(option);
- // 發起定位請求
- findViewById(R.id.btn_request).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mLocationClient.start();
- }
- });
- // 發起重新定位
- findViewById(R.id.btn_location).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mLocationClient != null && mLocationClient.isStarted()){
- mLocationClient.requestLocation();
- }
- }
- });
- // 發起查詢請求
- findViewById(R.id.btn_address).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mLocationClient != null && mLocationClient.isStarted()){
- mLocationClient.requestPoi();
- }
- }
- });
- }
- final class MyBDLocationListener implements BDLocationListener{
- @Override
- public void onReceiveLocation(BDLocation location) {
- Log.e(TAG, "---------onReceiveLocation()---------");
- if(location == null){
- Log.e(TAG, "---------onReceiveLocation------location is NULL----");
- return;
- }
- int type = location.getLocType();
- Log.i(TAG, "當前定位采用的類型是:type = " + type);
- String coorType = location.getCoorType();
- Log.i(TAG, "坐標系類型:coorType = " + coorType);
- // 判斷是否有定位精度半徑
- if(location.hasRadius()){
- // 獲取定位精度半徑,單位是米
- float accuracy = location.getRadius();
- Log.i(TAG, "accuracy = " + accuracy);
- }
- if(location.hasAddr()){
- // 獲取反地理編碼。 只有使用網絡定位的情況下,才能獲取當前位置的反地理編碼描述。
- String address = location.getAddrStr();
- Log.i(TAG, "address = " + address);
- }
- String province = location.getProvince(); // 獲取省份信息
- String city = location.getCity(); // 獲取城市信息
- String district = location.getDistrict(); // 獲取區縣信息
- Log.i(TAG, "province = " + province);
- Log.i(TAG, "city = " + city);
- Log.i(TAG, "district = " + district);
- double latitude = location.getLatitude();
- double longitude = location.getLongitude();
- Log.i(TAG, "latitude = " + latitude);
- Log.i(TAG, "longitude = " + longitude);
- }
- @Override
- public void onReceivePoi(BDLocation poiLocation) {
- Log.e(TAG, "---------onReceivePoi()---------");
- if(poiLocation == null){
- Log.e(TAG, "---------onReceivePoi------location is NULL----");
- return;
- }
- if(poiLocation.hasPoi()){
- String poiStr = poiLocation.getPoi();
- Log.i(TAG, "poiStr = " + poiStr);
- }
- if(poiLocation.hasAddr()){
- // 獲取反地理編碼。 只有使用網絡定位的情況下,才能獲取當前位置的反地理編碼描述。
- String address = poiLocation.getAddrStr();
- Log.i(TAG, "address = " + address);
- }
- }
- }
- @Override
- protected void onDestroy() {
- if(mLocationClient != null && mLocationClient.isStarted()){
- if(mBDLocationListener != null){
- mLocationClient.unRegisterLocationListener(mBDLocationListener);
- }
- mLocationClient.stop();
- mLocationClient = null;
- }
- super.onDestroy();
- }
- }
轉自:http://blog.csdn.net/android_ls/article/details/8583437
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
不知道大家是否用過天天動聽,對於它界面上的半透明Menu效果,筆者感覺非常漂亮
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個