Android開發之手機定位

手機定位基於以下三種方式:1. 網絡定位 ;2. 基站定位; 3. GPS定位

1 網絡定位

前提是必須連上網絡:Wifi、3G、2G

獲取到IP地址
例如:彩虹版QQ,珊瑚蟲版QQ,就有一個功能顯示對方的IP;
根據IP顯示具體的位置;

原理是建立一個庫那個IP地址對應那個地方;早期警方破案就采用此特點;

有局限性:針對固定的IP地址。
如果手機網或者ip地址是動態分佈IP,這個偏差就很大。這種情況是無法滿足需求的。

2 基站定位

工作原理:手機能打電話,是需要基站的。手機定位也是用基站的。
手機附近能收到3個基站的信號,就可以定位瞭。
基站定位有可能很準確,比如基站多的地方;
如果基站少的話就會相差很大。
精確度:幾十米到幾公裡不等;

3 GPS定位

A-GPS 使用瞭衛星定位 需要聯網輔助修正位置(手機經常使用,優先請求網絡,獲取之前保存的衛星軌道的信息cache,)
特點是:需要搜索衛星, 頭頂必須是空曠的;

影響條件:雲層、大廈、大樹。

以下是實現的代碼:

package com.andy.gpsdemo;

import com.example.gpsdemo.R;

import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class MainActivity extends ActionBarActivity {
	// 位置服務
	private LocationManager locationManager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

		/*List provider = locationManager.getAllProviders();
		for (String string : provider) {
			System.out.println(string);
		}*/

		// 註冊監聽位置服務
		// 給位置提供者設置條件
		Criteria criteria = new Criteria();
		criteria.setAccuracy(Criteria.ACCURACY_FINE);// 獲取精確的位置
		// criteria.setAccuracy(Criteria.ACCURACY_FINE);//設置為最大精度
		// criteria.setAltitudeRequired(false);//不要求海拔信息
		// criteria.setBearingRequired(false);//不要求方位信息
		// criteria.setCostAllowed(true);//是否允許付費
		// criteria.setPowerRequirement(Criteria.POWER_LOW);//對電量的要求

		String proveder = locationManager.getBestProvider(criteria, true);
		locationManager.requestLocationUpdates(proveder, 0, 0,
				new LocationListener() {

					@Override
					public void onLocationChanged(Location location) {
						// 當改變位置時回調
						String longitude = "經度:" + location.getLongitude();
						String latitudeString = "維度:" + location.getLatitude();
						String accuracy = "精確度:" + location.getAccuracy();
						TextView textView = new TextView(MainActivity.this);
						textView.setText(longitude + "\n" + latitudeString
								+ "\n" + accuracy);

						setContentView(textView);
					}

					@Override
					public void onProviderDisabled(String provider) {
						// 當一個位置提供者不可以使用
					}

					@Override
					public void onProviderEnabled(String provider) {
						// 當一個位置提供者可以使用
					}

					@Override
					public void onStatusChanged(String provider, int status,
							Bundle extras) {
						// 當狀態發生改變的時候回調 開啟--關閉 ;關閉--開啟
					}

				});
	}

}

佈局文件為:


    


需要加入的權限為:

//模擬器測試使用

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *