Android使用百度定位SDK 方法及錯誤處理

來源:互聯網
上載者:User

之前我的項目中的位置定位使用的是基站方法,使用的Google提供的API,但是前天中午突然就不返回資料了,到網上搜了一下才知道,Google的接 口不提供服務了,基於時間緊迫用了百度現有的SDK,但是在使用過程中第一次擷取位置總是空值,經過多次實驗終於成功。當然,如果需要精確的位置,你可以 再加上位置位移演算法。我的應用程式對這個要求不高,就沒做,一搜一大把,就不多說了。

下面這段話來自 百度地圖API>定位SDK

百度地圖定位SDK免費對外開放,無需申請key。在使用百度定位SDK前,希望先閱讀百度定位地圖的API。如果使用則被視為對使用規定的完全接收,並同意接收本協議的各項條款約束。
目前百度地圖定位SDK只支援Android和Symbian量大平台,其他產品正在開放中。

下面案例是使用Android平台的部分代碼。對於這個平台百度的開放人員已經寫了完整的demo,把工程匯入到eclipse中之後一般沒有錯誤,如果報錯的話,eclipse也會給出提示。一般可以通過將propertie.properties檔案名稱字改為default.properties就 可以了,如果還有錯誤的話,顯示工程activity錯誤啊什麼的,就是SDK版本不對的問題了,你可以通過他的manifest檔案查 看<uses-sdk android:minSdkVersion="8" />找到這個最小值,比如我下載的是2.6他的最低版本是5,我eclipse預設版本是8,就可以同過按右鍵該工程,選擇最下面那個properties項,然後在彈出對話方塊的右側列表中選擇Android,在左側選擇API level為5,也就是2.0,然後確定。就木有問題了。

下面說一下使用該API的具體步驟:
也可以查看百度定位SDK自己的開發指南

1、首先第一步就是搭配環境:
①先將百度demo中的libs檔案夾複製到自己的工程。(別忘記把jar包build path)
②然後複製

<service android:name="com.baidu.location.f" android:enabled="true"
android:process=":remote" android:permission="android.permission.BAIDU_LOCATION_SERVICE">
<intent-filter>
       <action android:name="com.baidu.location.service_v2.6"></action>
</intent-filter>
</service>

 

到manifest的application 節點
接下來複製百度地位SDK需要的permission

        <permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></permission>
<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE">
        </uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">
        </uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
        </uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">
        </uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">
        </uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE">
        </uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE">
        </uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
        </uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
        </uses-permission>
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

③ 接下來就可以在代碼中放心的使用百度定位SDK了.
   下面是來自百度的提醒.需要注意的是第五條,因為我們第一次經常定位不到位置:

1、您需要確保程式編譯通過。如果對自己寫的代碼有疑問,可以下載官方進階樣本,查看標準原始碼。

2、請確保網路通暢,無論是串連wifi還是使用2G/3G訊號。

3、定位SDK的調用必須在主線程中。

4、必須在定位SDK啟動前設定好參數,例如是否使用GPS,掃描時間間隔設定等。我們強烈建議您設定自己的prodName,並保管好,這樣方便我們為您提供更好的定位服務。

5、定位SDK start之後立即執行,這種情況下很難定位成功,因為定位SDK剛開始啟動還沒有擷取到定位資訊。這時getlocation一般為null。如果是要擷取位置成功,可以在listerner中添加一個判斷如果strData為空白,則再發起一次定位。

6、定位覆蓋率大概在98%。就是說有2%可能伺服器沒有資料,所以定位會失敗。只需要走到別的地方,或者多試幾次即可成功定位。

7、請使用真機。在虛擬機器上無法進行定位測試。

下面就是我的案例代碼:
具體思路是:將開啟和擷取位置的代碼分開來做,可以在程式剛開啟的時候就start。因為據上面所說,有時候可能兩分鐘才能擷取到位置,對於我們需要展示資訊來說,這是絕對不可以的。如果在主線程卡兩分鐘後果可想而知的。
需要說名的是:我這裡沒有設定時間間隔public void setScanSpan ( int ) //設定定時定位的時間間隔。單位ms,如果不設定或者所設定的整數值小於1000(ms)時,採用第一次定位元模式。每調用一次requestLocatin(),定位SDK會發起一次定位。請求定位與監聽結果一一對應;如果所設的整數值大於等於1000(ms)時,定位SDK內部使用定時定位元模式。調用requestLocation( )後,每隔設定的時間,定位SDK就會進行一次定位。如果定位SDK根據定位依據發現位置沒有發生變化,就不會發起網路請求,返回上一次定位的結果;如果發現位置改變,就進行網路請求進行定位,得到新的定位結果。定時定位時,調用一次requestLocation,會定時監聽到定位結果。設 定了定時定位後,可以熱切換成一次定位,需要重新設定時間間隔小於1000(ms)即可。locationClient對象stop後,將不再進行定位。 如果設定了定時定位元模式後,多次調用requestLocation(),則是每隔一段時間進行一次定位,同時額外的定位請求也會進行定位,但頻率不會超 過1秒一次。

import android.content.Context;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.palmdeal.entity.LocationInfo.SItude;
import com.palmdeal.util.Logger;

public class LocationProvider {
    private static LocationClient mLocationClient = null;

    private static SItude station = new SItude();
    private static MyBDListener listener = new MyBDListener();

    Context context;

    public LocationProvider(Context context) {
        super();
        this.context = context;
    }

    public void startLocation() {
        mLocationClient = new LocationClient(context);
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 開啟gps
        option.setCoorType("bd09ll"); // 設定座標類型為bd09ll
        option.setPriority(LocationClientOption.NetWorkFirst); // 設定網路優先
        option.setProdName("demo"); // 設定產品線名稱
        mLocationClient.setLocOption(option);
        mLocationClient.registerLocationListener(listener);
        mLocationClient.start();//將開啟與擷取位置分開,就可以盡量的在後面的使用中擷取到位置
    }

    /**
     * 停止,減少資源消耗
     */
    public void stopListener() {
        if (mLocationClient != null && mLocationClient.isStarted()) {
            mLocationClient.stop();
            mLocationClient = null;
        }
    }

    /**
     * 更新位置並儲存到SItude中
     */
    public void updateListener() {
        if (mLocationClient != null && mLocationClient.isStarted()) {
            mLocationClient.requestLocation();
            Logger.i("update the location");
        }
    }

    /**
     * 擷取經緯度資訊
     *
     * @return
     */
    public SItude getLocation() {
        return station;
    }

    private static class MyBDListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            if (location.getCity() == null) {
                int type = mLocationClient.requestLocation();
                Logger.e("first request false" + type);
            }
            station.latitude = location.getLatitude();
            station.longitude = location.getLongitude();
        }

        @Override
        public void onReceivePoi(BDLocation arg0) {
            // return
        }

    }
}

public class LocationInfo {
    /** 經緯度資訊結構體 */
    public static class SItude {
        /** 緯度 */
        public double latitude;
        /** 經度 */
        public double longitude;
    }
}

在使用的時候,在一開始就開啟LocationClient,即調用startLocation()方法。我的是在服務服務中的onCreate中調用的,然後在代碼中這樣使用:

 LocationInfo.SItude station = location.getLocation();
if (station.latitude == 0.0 && station.longitude == 0.0) {
       location.updateListener();
       station = location.getLocation();
}
if (station.latitude == 0.0 && station.longitude == 0.0) {
        return "未定位到您現在的位置,請重試";
}
location.stopListener();

使用上面的方法後,第一次使用都能拿到位置資訊。  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.