關於android上的定位


最近在做定位相關的東西,把知識整理一下並分享出來。

1.定位有三種,網絡,基站,GPS

2.不管哪種定位核心是要取得經緯度,你知道了經緯度要換算成具體地理位置的方法是有很多種的

以下分別講述三種的實現:

◆GPS

比較簡單

    public String mac;
    TextView msg;
    LocationManager locationManager;
    LocationListener locationListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        msg = (TextView) findViewById(R.id.text);
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        // 定義對位置變化的監聽函數
        locationListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                msg.setText("onLocationChanged" + location.getLatitude() + ",,"
                        + location.getLongitude());
                Log.e("onLocationChanged", location.getLatitude() + ",,"
                        + location.getLongitude());

            }

            public void onStatusChanged(String provider, int status,
                    Bundle extras) {
            }

            public void onProviderEnabled(String provider) {
            }

            public void onProviderDisabled(String provider) {
            }
        };
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                0, locationListener);

    }

關於GPS需要注意的地方就是首先你手機定位設置那里要打開GPS,還有manifest.xml中相關的權限要寫進去(一搜一大把,不贅述),最后記得在戶外測試,室內是測試不到GPS的。

◆基站

這一塊你要自己實現也是可以的,不過復雜程度遠比你想的要多一些。要獲取基站信息可以使用Android自帶的API,這很簡單如以下代碼

    private void getCellInfo() throws Exception {

        /** 調用API獲取基站信息 */
        TelephonyManager mTelNet = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        GsmCellLocation location = (GsmCellLocation) mTelNet.getCellLocation();
        if (location == null)
            throw new Exception("獲取基站信息失敗");
        String operator = mTelNet.getNetworkOperator();
        Log.e("基站信息", operator);
        String mcc = operator.substring(0, 3);
        String mnc = operator.substring(3,5);
        int cid = location.getCid();
        int lac = location.getLac();

        Log.e("具體基站信息", "mcc=" + mcc + ",mnc=" + mnc + ",lac=" + lac + ",cid="
                + cid);
    }

 

但是你要吧基站信息轉為經緯度就比較麻煩了,這里當然最權威的是google了,網絡上也找過一些其他的免費網站,很顯然不靠譜,我相信你搜出過這樣的API接口http://www.google.com/loc/json,我很負責任的告訴你,這個接口用不了,現在停用了,如果你研究了半天,一直在想post過去的數據為什么不行,然后發現原來是這個API停用了,那我覺得你現在看到我這篇文章是幸福的,所以還是用google把,下面進入此網站https://developers.google.com/maps/documentation/business/geolocation/這里面就有我們需要的信息,我找了很久,google maps各種相關的API都找過了,這里有我們需要的通過基站信息得到經緯度的API,不過它是基於商業的,測試每天100次上限,發布后應該要用收費的,具體費用沒查了。不要覺得這個很容易,我相信你花了半天在測試的時候會發現更多衍生出來的問題。而且需要有英語閱讀能力,對於大部分人來說門檻過高了,建議略過。因為基站實際情況下並不太好用,比如手機沒SIM卡和平板的情況下,是用不了基站的。

◆網絡

最建議大家使用的還是網絡定位,因為網絡實在太普遍的,移動設備現在基本都能上網,當然我這說的是wifi情況下的。3G的沒條件測試過,這里請不要使用android自帶的API,如

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0,
                0, locationListener);

因為國內大部分手機被閹割過了,你運氣好的話,也許能獲取到數據,如果運氣不好,搞了半天你發現是手機系統被閹割后的問題,我想你可能會抓狂的。所以網絡定位我們不能依賴Android API了。這里就推薦一下百度定位把,我測試了下,速度蠻好,也還准。地址如下http://developer.baidu.com/map/sdk-android.htm。然后如圖所示

看一下里面的simple中的MyLocation類,簡單明了,快速解決問題。不過國外沒測試過,不知道百度能不能用在國外了。當然google maps中android版SDK應該也有相應的功能,不過有點繁瑣了,比如你只定位國內的話,相信百度可以了,如果是國際上,那google永遠是你的首選

完結!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM