Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android GPS應用程序設計

android GPS應用程序設計

編輯:關於Android編程

GPS簡介

GPS是英文Global Positioning System(全球定位系統)的簡稱。GPS是20世紀70年代由美國陸海空三軍聯合研制的

新一代空間衛星導航定位系統 。其主要目的是為陸、海、空三大領域提供實時、 全天候和全球性的導航服務,並用於

情報收集、核爆監測和應急通訊等一些軍事目的,經過20余年的研究實驗,耗資300億美元,到1994年3月,全球覆蓋

率高達98%的24顆GPS衛星星座己布設完成。


GPS定位原理

GPS定位的基本原理是根據高速運動的衛星瞬間位置作為已知的起算數據,采用空間距離後方交會的方法,確定待測

點的位置。如圖所示,假設t時刻在地面待測點上安置GPS接收機,可以測定GPS信號到達接收機的時間△t,再加上接

收機所接收到的衛星星歷等其它數據可以確定以下四個方程式)

vcyozOG5qcHL0ru49mFuZHJvaWQubG9jYXRpb261xLD8LNPQOLj2wOChozxzdHJvbmc+usvQxLXEM7j2wOA6PC9zdHJvbmc+PC9wPgo8cD5Mb2NhdGlvbk1hbmFnZXLA4KO61/fTw9PrV2lmaU1hbmFnZXKholRlbGVwaG9ueU1hbmFnZXK1yLf+zvHA4LXE1/fTw8/gJiMyMDI4NDujrMv509DT60dQU7aozrvP4LnYtcS3/s7xoaI8L3A+CjxwPrbUz/O2vNPJuMO21M/zsvrJ+qGjPC9wPgo8cD5Mb2NhdGlvblByb3ZpZGVywOCjuraozrvM4bmp1d+jrEdQU7aozrvX6bz+tcSz6c/zse3KvqOszai5/bjDttTP87/J0tS78cihuMO2qM671+m8/rXEz+C52NDFz6KhozwvcD4KPHA+TG9jYXRpb27A4KO60ru49rT6se3Ou9bD0MXPorXEs+nP88DgoaM8L3A+CjxwPjxicj4KPHN0cm9uZz7KudPDy/zDx8C0u/HIoUdQU7aozrvQxc+itcTNqNPDsr3W6M6qo7o8L3N0cm9uZz48L3A+CjxwPrvxyKHPtc2zTG9jYXRpb25NYW5hZ2VyttTP8zwvcD4KPHA+yrnTw0xvY2F0aW9uTWFuYWdlcqOszai5/da4tqi1xLaozrvJ6LG4TG9jYXRpb25Qcm92aWRlcsC0u/HIobaozrvQxc+iTG9jYXRpb26hozwvcD4KPHA+tNNMb2NhdGlvbrbUz/PW0LvxyKG2qM670MXPojwvcD4KPHA+PGJyPgo8L3A+CjxwPjxzdHJvbmc+TG9jYXRpb25NYW5hZ2VyPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPkxvY2F0aW9uTWFuYWdlcrbUz/O1xLvxyKGjujwvc3Ryb25nPjwvcD4KPHA+TG9jYXRpb25NYW5hZ2VyICBsbT0gKExvY2F0aW9uTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTE9DQVRJT05fU0VSVklDRSk7IDwvcD4KPHA+PHN0cm9uZz6zo9PDt723qDwvc3Ryb25nPjwvcD4KPHA+TGlzdDxTdHJpbmc+IGdldEFsbFByb3ZpZGVycygpILvxtcPL+dPQtcRMb2NhdGlvblByb3ZpZGVywdCx7TwvcD4KPHA+TG9jYXRpb25Qcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgbmFtZSkguPm+3cP7s8bAtLvxyKFMb2NhdGlvblByb3ZpZGVyPC9wPgo8cD5MaXN0PFN0cmluZz4gZ2V0UHJvdmlkZXJzKGJvb2xlYW4gZW5hYmxlZE9ubHkpILvxyKHL+dPQv8nTw7XETG9jYXRpb25Qcm92aWRlcjwvcD4KPHA+TGlzdDxTdHJpbmc+IGdldFByb3ZpZGVycyhDcml0ZXJpYSBjcml0ZXJpYSwgYm9vbGVhbiBlbmFibGVkT25seSkguPm+3da4tqjM9bz+u/HIocL61+O4w8z1vP61xMirsr9Mb2NhdGlvblByb3ZpZGVytcTD+7PGPC9wPgo8cD5TdHJpbmcgZ2V0QmVzdFByb3ZpZGVyKENyaXRlcmlhIGNyaXRlcmlhLCBib29sZWFuIGVuYWJsZWRPbmx5KSC4+b7d1ri2qMz1vP63tbvY1+7TxbXETG9jYXRpb25Qcm92aWRlcrbUz/M8L3A+CjxwPmJvb2xlYW4gaXNQcm92aWRlckVuYWJsZWQoU3RyaW5nIHByb3ZpZGVyKSDF0LbP1ri2qMP7s8a1xExvY2F0aW9uUHJvdmlkZXLKx7fxv8nTwzwvcD4KPHA+TG9jYXRpb24gZ2V0TGFzdEtub3duTG9jYXRpb24oU3RyaW5nIHByb3ZpZGVyKSC78cih1+69/NK7tM7S0daqtcRMb2NhdGlvbjwvcD4KPHA+YWRkUHJveGltaXR5QWxlcnQoZG91YmxlIGxhdGl0dWRlLCBkb3VibGUgbG9uZ2l0dWRlLCBmbG9hdCByYWRpdXMsIGxvbmcgZXhwaXJhdGlvbiwgUGVuZGluZ0ludGVudCBpbnRlbnQpIDrM7bzT0ru49sf3vfw8L3A+CjxwPr6vuOY8L3A+CjxwPnZvaWQgcmVtb3ZlUHJveGltaXR5QWxlcnQoUGVuZGluZ0ludGVudCBpbnRlbnQpIMm+s/3Su7j2wdm9/L6vuOY8L3A+CjxwPnZvaWQgcmVxdWVzdExvY2F0aW9uVXBkYXRlcyhsb25nIG1pblRpbWUsIGZsb2F0IG1pbkRpc3RhbmNlLCBDcml0ZXJpYSBjcml0ZXJpYSwgUGVuZGluZ0ludGVudCBpbnRlbnQpIDwvcD4KPHA+dm9pZCByZXF1ZXN0TG9jYXRpb25VcGRhdGVzKFN0cmluZyBwcm92aWRlciwgbG9uZyBtaW5UaW1lLCBmbG9hdCBtaW5EaXN0YW5jZSwgTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgzai5/da4tqi1xDwvcD4KPHA+TG9jYXRpb25Qcm92aWRlctbcxtrQ1LXYu/HIobaozrvQxc+iLLKizai5/WludGVudMb0tq/P4NOmtcTX6bz+PC9wPgo8cD52b2lkIHJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoU3RyaW5nIHByb3ZpZGVyLCBsb25nIG1pblRpbWUsIGZsb2F0IG1pbkRpc3RhbmNlLCBQZW5kaW5nSW50ZW50IGludGVudCkgIM2ouf3WuLaotcQ8L3A+CjxwPkxvY3Rpb25Qcm92aWRlctbcxtrQ1LXYu/HIobaozrvQxc+iLLKizai5/WludGVudMb0tq/P4NOmtcTX6bz+PC9wPgo8cD48YnI+Cjxicj4KPHN0cm9uZz5Mb2NhdGlvblByb3ZpZGVyICi2qM67zOG5qdXfKTwvc3Ryb25nPjwvcD4KPHA+YWJzdHJhY3QgaW50IGdldEFjY3VyYWN5KCkgt7W72LjDTG9jYXRpb25Qcm92aWRlcrXEvqu2yDwvcD4KPHA+U3RyaW5nIGdldE5hbWUoKSC3tbvYuMNMb2NhdGlvblByb3ZpZGVytcTD+7PGPC9wPgo8cD5pbnQgZ2V0UG93ZXJSZXF1aXJlbWVudCgpILvxyKG4w0xvY3Rpb25Qcm92aWRlcrXEtefUtNDox/M8L3A+CjxwPmJvb2xlYW4gaGFzTW9uZXRhcnlDb3N0KCkgu/HIobjDTG9jYXRpb25Qcm92aWRlcsrHytW30bXEu7nKx8Pit9G1xDwvcD4KPHA+Ym9vbGVhbiBtZWV0c0NyaXRlcmlhKENyaXRlcmlhIGNyaXRlcmlhKSDF0LbPuMNMb2NhdGlvblByb3ZpZGVyyse38cL61+NDcml0ZXJpYcz1vP48L3A+CjxwPmJvb2xlYW4gcmVxdWlyZXNDZWxsKCkgxdC2z7jDTG9jYXRpb25Qcm92aWRlcsrHt/HQ6NKqt8POys34wue7+dW+PC9wPgo8cD5ib29sZWFuIHJlcXVpcmVzTmV0d29yaygpIMXQts+4w0xvY2F0aW9uUHJvdmlkZXLKx7fx0OjSqrfDzsrN+MLnyv2+3TwvcD4KPHA+Ym9vbGVhbiByZXF1aXJlc1NhdGVsbGl0ZSgpIMXQts+4w0xvY3Rpb25Qcm92aWRlcsrHt/HQ6NKqt8POyrv509rOwNDHtcS2qM67z7XNszwvcD4KPHA+Ym9vbGVhbiBzdXBwb3J0c0FsdGl0dWRlKCkgxdC2z7jDTG9jdGlvblByb3ZpZGVyyse38dans9a437bI0MXPojwvcD4KPHA+Ym9vbGVhbiBzdXBwb3J0c0JlYXJpbmcoKSDF0LbPuMNMb2NhdGlvblByb3ZpZGVyyse38dans9a3vc/y0MXPojwvcD4KPHA+Ym9vbGVhbiBzdXBwb3J0c1NwZWVkKCkgxdC2z7jDTG9jdGlvblByb3ZpZGVyyse38dans9bL2bbI0MXPojwvcD4KPHA+PGJyPgo8L3A+CjxwPjxzdHJvbmc+TG9jYXRpb24ozrvWw9DFz6IpPC9zdHJvbmc+PC9wPgo8cD5mbG9hdCBnZXRBY2N1cmFjeSgpILvxyKG2qM670MXPorXEvqu2yDwvcD4KPHA+ZG91YmxlIGdldEFsdGl0dWRlKCkgu/HIobaozrvQxc+itcS437bIPC9wPgo8cD5mbG9hdCBnZXRCZWFyaW5nKCkgu/HIobaozrvQxc+itcS3vc/yPC9wPgo8cD5kb3VibGUgZ2V0TGF0aXR1ZGUoKSC78cihtqjOu9DFz6K1xM6ztsg8L3A+CjxwPmRvdWJsZSBnZXRMb25naXR1ZGUoKSC78cihtqjOu9DFz6K1xL6ttsg8L3A+CjxwPlN0cmluZyBnZXRQcm92aWRlcigpILvxyKHM4bmpuMO2qM670MXPorXETG9jYXRpb25Qcm92aWRlcjwvcD4KPHA+ZmxvYXQgZ2V0U3BlZWQoKSC78cihtqjOu9DFz6K1xMvZtsg8L3A+CjxwPmxvbmcgZ2V0VGltZSgpIDwvcD4KPHA+Ym9vbGVhbiBoYXNBY2N1cmFjeSgpIMXQts+4w7aozrvQxc+iyse38dPQvqu2yNDFz6I8L3A+CjxwPmJvb2xlYW4gaGFzQWx0aXR1ZGUoKSDF0LbPuMO2qM670MXPosrHt/HT0LjftsjQxc+iPC9wPgo8cD5ib29sZWFuIGhhc0JlYXJpbmcoKSDF0LbPuMO2qM670MXPosrHt/HT0Le9z/LQxc+iPC9wPgo8cD5ib29sZWFuIGhhc1NwZWVkKCkgxdC2z7jDtqjOu9DFz6LKx7fx09DL2bbI0MXPojwvcD4KPHA+PGJyPgo8L3A+CjxwPjxzdHJvbmc+u/HIobaozrvQxc+iPC9zdHJvbmc+PC9wPgo8cD4xILvxyKHL+dPQv8nTw7XETG9jYXRpb25Qcm92aWRlcjwvcD4KPHA+TG9jYXRpb25NYW5hZ2VyzOG5qcHL0ru49mdldEFsbFByb3ZpZGVyKCm3vbeowLS78cihz7XNs8v509C/ydPDtcRMb2NhdGlvblByb3ZpZGVyPC9wPgo8cD7Ptc2zubLT0Mj91tbA4NDNtcRMb2NhdGlvblByb3ZpZGVyPC9wPgo8cD5uZXR3b3JrIDog08lMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUrOjwb+x7cq+PC9wPgo8cD5ncHMgOiDTyUxvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVKzo8G/se3KvjwvcD4KPHA+cGFzc2l2ZSA6INPJTG9jdGlvbk1hbmFnZXIuUEFTU0lWRV9QUk9WSURFUrOjwb+x7cq+PC9wPgo8cD4yIM2ouf3D+7PGu/G1w9a4tqhnZXRQcm92aWRlcihTdHJpbmcgbmFtZSk8L3A+CjxwPjMguPm+3UNyaXRlcmlhu/G1w2dldFByb3ZpZGVycyhDcml0ZXJpYSBjcml0ZXJpYSwgYm9vbGVhbiBlbmFibGVkT25seSkgPC9wPgo8cD5Dcml0ZXJpYTq0+rHtwcvSu7j2obC5/cLLobHM9bz+o6zL/MzhuanBy9K70Km3vbeowLTJ6NbDzPW8/jwvcD4KPHA+dm9pZCBzZXRBY2N1cmFjeShpbnQgYWNjdXJhY3kpIDwvcD4KPHA+dm9pZCBzZXRBbHRpdHVkZVJlcXVpcmVkKGJvb2xlYW4gYWx0aXR1ZGVSZXF1aXJlZCkgPC9wPgo8cD52b2lkIHNldEJlYXJpbmdBY2N1cmFjeShpbnQgYWNjdXJhY3kpIDwvcD4KPHA+dm9pZCBzZXRCZWFyaW5nUmVxdWlyZWQoYm9vbGVhbiBiZWFyaW5nUmVxdWlyZWQpIDwvcD4KPHA+PHN0cm9uZz678cihTG9jYXRpb25NYW5hZ2VyttTP87rzo6y/yc2ouf3WuLaotcRMb2NhdGlvblByb3ZpZGVyu/HIobaozrvQxc+io6zI56O6vq22yKGizqy2yKGiuN+2yKGi0sa2r8vZtsi1yKGjPC9zdHJvbmc+PC9wPgo8cD5HUFO3w87KyKjP3jwvcD4KPHA+IDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPaGwYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19GSU5FX0xPQ0FUSU9OobE+PGJyPgo8L3A+CjxwPjxicj4KPC9wPgo8cD48c3Ryb25nPsf3vfy+r7jmPC9zdHJvbmc+PGJyPgo8L3A+CjxwPsf3vfy+r7jmvs3Kx7Wx08O7p8rWu/rB2b381ri2qLXjyrGjrLWx0+u4w7XjtcS+4MDr0KHT2ta4tqi3ts6nyrGjrM+1zbO/ybSlt6LP4NOmtcS0psDtLLjDuabE3MTcubu21M7Sw8c8L3A+CjxwPr34yOu78s3Ls/bEs7j2yei2qLXEx/jT8r340NDM4cq+oaM8L3A+CjxwPkxvY2F0aW9uTWFuYWdlcszhuam3vbeoo7phZGRQcm94aW1pdHlBbGVydChkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGZsb2F0IHJhZGl1cywgbG9uZyBleHBpcmF0aW9uLCA8L3A+CjxwPlBlbmRpbmdJbnRlbnQgaW50ZW50KaOsPC9wPgo8cD5sYXRpdHVkZb6ttsihomxvbmdpdHVkZc6ztsijrCByYWRpdXPH+NPysOu+tqOsIGV4cGlyYXRpb27WuLaovq25/bbgydm6wcPruf3G2qOsLTHOqtPAsru5/cbao6xQZW5kaW5nSW50ZW501rg8L3A+CjxwPraotKW3orXESW50ZW501+m8/qGjPC9wPgo8cD7Sqsq1z9a0y7mmxNzQ6NKqwb249rK91uijujwvcD4KPHA+0rvKx7vxtcNMb2NhdGlvbk1hbmFnZXLKtcD9o6y199PDxuS3vbeoYWRkUHJveGltaXR5YWxlcnSyosztvNPH9738zOHKvqO7PC9wPgo8cD62/srHtqjS5dK7uPa547KlvdPK1cb3o6y1scnosbi9+Mjryei2qMf40/LKsczh0NHTw7unoaM8L3A+CjxwPjxicj4KPC9wPgo8cD7A/dfTtPrC6zo8L3A+CjxwPrvxyKFMb2NhdGlvblByb3ZpZGVyOjwvcD4KPHA+u/HIocv509C1xExvY2F0aW9uUHJvdmlkZXK1xMP7s8Y8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;"> // 獲取LocationManager對象 mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 獲取所有的LocationProvider的名稱 List providerNames = mLocationManager.getAllProviders();通過名稱獲取指定LocationProvider

//獲取基於GPS的LocationProvider
LocationProvider locProvider = lm.getProvider(LocatinManager.GPS_PROVIDER)
根據Criteria獲得LocationProvider
                mProviders = (ListView) findViewById(R.id.providers);
		// 獲取系統的LocationManager對象
		mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		// 創建一個LocationProvider的過濾條件
		Criteria cri = new Criteria();
		// 設置要求LocationProvider必須是免費的。
		cri.setCostAllowed(false);

		// 設置要求LocationProvider能提供高度信息
		cri.setAltitudeRequired(true);  
		// 設置要求LocationProvider能提供方向信息
		cri.setBearingRequired(true);
		// 獲取系統所有符合條件的LocationProvider的名稱
		List providerNames = mLocationManager.getProviders(cri, true);


獲取定位數據:

// 創建LocationManager對象
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // 從GPS獲取最近的定位信息
        Location location = mLocationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        // 使用location根據EditText的顯示
        updateView(location);
        // 設置每2秒獲取一次GPS的定位信息
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                2000, 8, new LocationListener() {
                    @Override
                    public void onLocationChanged(Location location) {
                        // 當GPS定位信息發生改變時,更新位置
                        updateView(location);
                    }

                    @Override
                    public void onProviderDisabled(String provider) {
                        updateView(null);
                    }

                    @Override
                    public void onProviderEnabled(String provider) {
                        // 當GPS LocationProvider可用時,更新位置
                        updateView(mLocationManager
                                .getLastKnownLocation(provider));
                    }

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

    }

    // 更新EditText中顯示的內容
    public void updateView(Location newLocation) {
        if (newLocation != null) {
            StringBuilder sb = new StringBuilder();
            sb.append("實時的位置信息:\n");
            sb.append("經度:");
            sb.append(newLocation.getLongitude());
            sb.append("\n緯度:");
            sb.append(newLocation.getLatitude());
            sb.append("\n高度:");
            sb.append(newLocation.getAltitude());
            sb.append("\n速度:");
            sb.append(newLocation.getSpeed());
            sb.append("\n方向:");
            sb.append(newLocation.getBearing());
            mEditText.setText(sb.toString());
        } else {
            // 如果傳入的Location對象為空則清空EditText
            mEditText.setText("");
        }


	
該程序需要有訪問GPS信號的權限,因此需要在AndroidManifest.xml文件中增加授權信息.

用於從Location中獲取定位信息,包括用戶的經度,緯度,高度,方向,和移動速度等信息,並通過LocationManager設置了

個監聽器,該監聽器負責每隔3秒向LocationProvider請求一次定位信息,當LocationProvider可用時,不可用時或提供的定

位信息發生改變時,系統會回調對應的方法更新界面.

如果該程序與Google Map結合,讓該程序根據GPS提供的信息實時地顯示用戶在地圖上的位置,即可開發GPS導航系統


趨近警告:

// 定位服務管理器對象
        LocationManager locationManager;
        // 通過getSystemService方法獲得LocationManager對象
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // 定義萬裡學院4號樓的大致經度、緯度
        double longitude = 123.427109;
        double latitude = 41.764998;
        // 定義半徑(2000米) 
        float radius = 2000;

        // 定義Intent
        Intent intent = new Intent(this, ProximityAlertReciever.class);
        // 將Intent包裝成PendingIntent
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1,
                intent, 0);

        // 添加臨近警告
        locationManager.addProximityAlert(latitude, longitude, radius, -1,
                pendingIntent);
對應啟動的BroadcastReceiver :
public class ProximityAlertReciever extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        // 獲取是否為進入指定區域
        boolean isEnter = intent.getBooleanExtra(
                LocationManager.KEY_PROXIMITY_ENTERING, false);
        if (isEnter) {
            // 顯示提示信息
            Toast.makeText(context, "您已經接近萬裡學院4號樓", Toast.LENGTH_LONG).show();
        } else {
            // 顯示提示信息
            Toast.makeText(context, "您已經離開萬裡學院4號樓", Toast.LENGTH_LONG).show();
        }
    }
}

    
    
    


計算兩點距離:

final float[] results = new float[3];

        Location.distanceBetween(20.123, 30.05644, 30.124, 40.543, results);
        final float bearing = results[1];
        mEditText.setText(String.valueOf(results[0]) + "米");





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