位置決め
429548 ワード
まずModelを定義します.
そしてLBSのすべての機能はツールクラスにカプセル化されます.
まず、コンストラクション関数でシステムサービスのLocationManagerを取得します.
次にエントリメソッドです.ここではサブスレッドを起動して地理的位置情報を取得し、メインスレッドを待機させます.時間長はtimeout設定を通過します.
サブスレッドはregisterLocationListenerを呼び出して位置サービスのリスニングを開始し、指定したlooperにリスナーを割り当てます.
isGPSEnabledとisNetworkEnabledは、それぞれ、現在の携帯電話がGPSをオンにしているかどうかおよびネットワークの状況(wifiとモバイルネットワークをオンにしているかどうかを含む)を判断するために、どのサービスプロバイダを使用するかを決定する:GPS_PROVIDERまたはNETWORK_PROVIDER.
LocationManagerが最短時間以上で最小位置変化を検出した場合、リスナーに通知され、戻った経緯情報でgoogleサーバに行って対応するアドレスを検索し、LocationMangerの作業を停止し、LBSthreadのLooperを解除し、LBSthreadを終了させ、最後にメインスレッドが継続できることを通知し、プロセス全体が終了する.
次に、インタフェースにbuttonを配置します.
最後に、アクセス権を忘れないでください.
さらに、LocationManagerでは、重要なパラメータを設定したり、最後のロケーション情報を取得したりするなど、高度な使い方があります.
- public class LocationData {
- String lat;
- String lon;
- String address;
- }
そしてLBSのすべての機能はツールクラスにカプセル化されます.
まず、コンストラクション関数でシステムサービスのLocationManagerを取得します.
- public class LBSTool {
- private Context mContext;
- private LocationManager mLocationManager;
- private LocationData mLocation;
- private LBSThread mLBSThread;
- private MyLocationListner mNetworkListner;
- private MyLocationListner mGPSListener;
- private Looper mLooper;
-
- public LBSTool(Context context) {
- mContext = context;
- // Location manager
- mLocationManager = (LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);
- }
-
- ......
- }
次にエントリメソッドです.ここではサブスレッドを起動して地理的位置情報を取得し、メインスレッドを待機させます.時間長はtimeout設定を通過します.
- /**
- *
- * @param timeout
- * @return LocationData , null
- */
- public LocationData getLocation(long timeout) {
- mLocation = null;
- mLBSThread = new LBSThread();
- mLBSThread.start();// LBSThread
- timeout = timeout > 0 ? timeout : 0;
-
- synchronized (mLBSThread) {
- try {
- Log.i(Thread.currentThread().getName(), "Waiting for LocationThread to complete...");
- mLBSThread.wait(timeout);// , timeout ms
- Log.i(Thread.currentThread().getName(), "Completed.Now back to main thread");
- }
- catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- mLBSThread = null;
- return mLocation;
- }
サブスレッドはregisterLocationListenerを呼び出して位置サービスのリスニングを開始し、指定したlooperにリスナーを割り当てます.
- private class LBSThread extends Thread {
- @Override
- public void run() {
- setName("location thread");
- Log.i(Thread.currentThread().getName(), "--start--");
- Looper.prepare();// LBSThread Looper
- mLooper = Looper.myLooper();
- registerLocationListener();
- Looper.loop();
- Log.e(Thread.currentThread().getName(), "--end--");
-
- }
- }
-
- private void registerLocationListener () {
- Log.i(Thread.currentThread().getName(), "registerLocationListener");
- if (isGPSEnabled()) {
- mGPSListener=new MyLocationListner();
-
- // , , ,listener,listener looper
- mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, mGPSListener, mLooper);
- }
- if (isNetworkEnabled()) {
- mNetworkListner=new MyLocationListner();
-
- mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, mNetworkListner, mLooper);
- }
- }
isGPSEnabledとisNetworkEnabledは、それぞれ、現在の携帯電話がGPSをオンにしているかどうかおよびネットワークの状況(wifiとモバイルネットワークをオンにしているかどうかを含む)を判断するために、どのサービスプロバイダを使用するかを決定する:GPS_PROVIDERまたはNETWORK_PROVIDER.
- /**
- * GPS
- * @return
- */
- public boolean isGPSEnabled() {
- if(mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
- Log.i(Thread.currentThread().getName(), "isGPSEnabled");
- return true;
- }
- else {
- return false;
- }
- }
-
- /**
- * Network ( wifi)
- * @return
- */
- public boolean isNetworkEnabled() {
- return (isWIFIEnabled() || isTelephonyEnabled());
- }
-
- /**
- *
- * @return
- */
- public boolean isTelephonyEnabled() {
- boolean enable = false;
- TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
- if (telephonyManager != null) {
- if (telephonyManager.getNetworkType() != TelephonyManager.NETWORK_TYPE_UNKNOWN) {
- enable = true;
- Log.i(Thread.currentThread().getName(), "isTelephonyEnabled");
- }
- }
-
- return enable;
- }
-
- /**
- * wifi
- */
- public boolean isWIFIEnabled() {
- boolean enable = false;
- WifiManager wifiManager = (WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);
- if(wifiManager.isWifiEnabled()) {
- enable = true;
- Log.i(Thread.currentThread().getName(), "isWIFIEnabled");
- }
- return enable;
- }
LocationManagerが最短時間以上で最小位置変化を検出した場合、リスナーに通知され、戻った経緯情報でgoogleサーバに行って対応するアドレスを検索し、LocationMangerの作業を停止し、LBSthreadのLooperを解除し、LBSthreadを終了させ、最後にメインスレッドが継続できることを通知し、プロセス全体が終了する.
- private class MyLocationListner implements LocationListener{
-
- @Override
- public void onLocationChanged(Location location) {
- // LocationManager ,
- Log.i(Thread.currentThread().getName(), "Got New Location of provider:"+location.getProvider());
- unRegisterLocationListener();// LocationManager
- try {
- synchronized (mLBSThread) {
- parseLatLon(location.getLatitude()+"", location.getLongitude()+"");//
- mLooper.quit();// LBSThread Looper,LBSThread
- mLBSThread.notify();//
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- // 3
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {}
-
- @Override
- public void onProviderEnabled(String provider) {}
-
- @Override
- public void onProviderDisabled(String provider) {}
-
- };
-
- /**
- * goole
- * @param
- */
- private void parseLatLon(String lat, String lon) throws Exception {
- Log.e(Thread.currentThread().getName(), "---parseLatLon---");
- Log.e(Thread.currentThread().getName(), "---"+lat+"---");
- try {
- HttpClient httpClient = new DefaultHttpClient();
- HttpGet get = new HttpGet("http://ditu.google.cn/maps/geo?output=json&q="+lat+","+lon);
- HttpResponse response = httpClient.execute(get);
- String resultString = EntityUtils.toString(response.getEntity());
-
- JSONObject jsonresult = new JSONObject(resultString);
- if(jsonresult.optJSONArray("Placemark") != null) {
- mLocation = new LocationData();
- mLocation.lat = lat;
- mLocation.lon = lon;
- mLocation.address = jsonresult.optJSONArray("Placemark").optJSONObject(0).optString("address");
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- *
- */
- private void unRegisterLocationListener () {
- if(mGPSListener!=null){
- mLocationManager.removeUpdates(mGPSListener);
- mGPSListener=null;
- }
- if(mNetworkListner!=null){
- mLocationManager.removeUpdates(mNetworkListner);
- mNetworkListner=null;
- }
- }
次に、インタフェースにbuttonを配置します.
- locationBtn.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- //return mode
- LBSTool lbs = new LBSTool(LBStestActivity.this);
- LocationData location = lbs.getLocation(120000);
- if (location != null) {
- Log.i("---lat---",location.lat);
- Log.i("---lon---",location.lon);
- Log.i("---address---",location.address);
- Toast.makeText(LBStestActivity.this, location.lat + " " + location.lon + " " + location.address, Toast.LENGTH_LONG).show();
-
- }
-
- }
- });
最後に、アクセス権を忘れないでください.
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
さらに、LocationManagerでは、重要なパラメータを設定したり、最後のロケーション情報を取得したりするなど、高度な使い方があります.
- Criteria criteria = new Criteria();
- criteria.setAccuracy(Criteria.ACCURACY_FINE); //
- criteria.setAltitudeRequired(false);
- criteria.setBearingRequired(false);
- criteria.setCostAllowed(true);
- criteria.setPowerRequirement(Criteria.POWER_LOW); //
-
- String bestprovider = locationManager.getBestProvider(criteria, true); // GPS
- Location location = locationManager.getLastKnownLocation(bestprovider); // GPS
- Log.e("--bestprovider--", bestprovider);
- Log.e("--bestprovider--", location.getLatitude()+"");