http://blog.csdn.net/limb99/article/details/18819925
很多應(yīng)用對(duì)定位的要求并不是那么高,也許只是確認(rèn)一下當(dāng)前位置大概在城市的那個(gè)方向或者臨時(shí)需要一個(gè)當(dāng)前的經(jīng)緯度本辐,這時(shí)候定位速度應(yīng)該是第一位的趟妥。下面就說(shuō)說(shuō)簡(jiǎn)單定位需求的實(shí)現(xiàn)炮障。
步驟
1.啟動(dòng)應(yīng)用的時(shí)候同時(shí)啟動(dòng)一個(gè)定位服務(wù)
2.定位服務(wù)獲取到定位信息后通過(guò)廣播告知UI層(activity)
3.UI層處理顯示
在下面的的例子中宵距,在獲取了當(dāng)前的位置信息后憾股,便停掉了的定位服務(wù)岔留,并沒(méi)有進(jìn)行實(shí)時(shí)定位夏哭,當(dāng)然也可以進(jìn)行實(shí)時(shí)定位。
實(shí)現(xiàn)代碼
定位服務(wù)(LocationSvc)代碼:
[java]view plaincopy

packagecom.sc.demo.locate;
importcom.sc.demo.common.Common;
importandroid.app.Service;
importandroid.content.Intent;
importandroid.location.Location;
importandroid.location.LocationListener;
importandroid.location.LocationManager;
importandroid.os.Bundle;
importandroid.os.IBinder;
importandroid.util.Log;
importandroid.widget.Toast;
/**
*?@author?SunnyCoffee
*?@date?2014-1-19
*?@version?1.0
*?@desc?定位服務(wù)
*
*/
publicclassLocationSvcextendsServiceimplementsLocationListener?{
privatestaticfinalString?TAG?="LocationSvc";
privateLocationManager?locationManager;
@Override
publicIBinder?onBind(Intent?intent)?{
returnnull;
}
@Override
publicvoidonCreate()?{
locationManager?=?(LocationManager)?getSystemService(LOCATION_SERVICE);
}
@Override
publicvoidonStart(Intent?intent,intstartId)?{
if(locationManager.getProvider(LocationManager.NETWORK_PROVIDER)?!=null)?locationManager
.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,
this);
elseif(locationManager.getProvider(LocationManager.GPS_PROVIDER)?!=null)?locationManager
.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,
this);
elseToast.makeText(this,"無(wú)法定位",?Toast.LENGTH_SHORT).show();
}
@Override
publicbooleanstopService(Intent?name)?{
returnsuper.stopService(name);
}
@Override
publicvoidonLocationChanged(Location?location)?{
Log.d(TAG,"Get?the?current?position?\n"+?location);
//通知Activity
Intent?intent?=newIntent();
intent.setAction(Common.LOCATION_ACTION);
intent.putExtra(Common.LOCATION,?location.toString());
sendBroadcast(intent);
//?如果只是需要定位一次献联,這里就移除監(jiān)聽(tīng)竖配,停掉服務(wù)何址。如果要進(jìn)行實(shí)時(shí)定位,可以在退出應(yīng)用或者其他時(shí)刻停掉定位服務(wù)进胯。
locationManager.removeUpdates(this);
stopSelf();
}
@Override
publicvoidonProviderDisabled(String?provider)?{
}
@Override
publicvoidonProviderEnabled(String?provider)?{
}
@Override
publicvoidonStatusChanged(String?provider,intstatus,?Bundle?extras)?{
}
}
UI處理層代碼
[java]view plaincopy

packagecom.sc.demo;
importcom.sc.demo.common.Common;
importcom.sc.demo.locate.LocationSvc;
importandroid.os.Bundle;
importandroid.widget.TextView;
importandroid.app.Activity;
importandroid.app.ProgressDialog;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
publicclassMainActivityextendsActivity?{
privateTextView?text;
privateProgressDialog?dialog;
@Override
protectedvoidonCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text?=?(TextView)?findViewById(R.id.text);
//?注冊(cè)廣播
IntentFilter?filter?=newIntentFilter();
filter.addAction(Common.LOCATION_ACTION);
this.registerReceiver(newLocationBroadcastReceiver(),?filter);
//?啟動(dòng)服務(wù)
Intent?intent?=newIntent();
intent.setClass(this,?LocationSvc.class);
startService(intent);
//?等待提示
dialog?=newProgressDialog(this);
dialog.setMessage("正在定位...");
dialog.setCancelable(true);
dialog.show();
}
privateclassLocationBroadcastReceiverextendsBroadcastReceiver?{
@Override
publicvoidonReceive(Context?context,?Intent?intent)?{
if(!intent.getAction().equals(Common.LOCATION_ACTION))return;
String?locationInfo?=?intent.getStringExtra(Common.LOCATION);
text.setText(locationInfo);
dialog.dismiss();
MainActivity.this.unregisterReceiver(this);//?不需要時(shí)注銷(xiāo)
}
}
}
公共類(lèi)
[java]view plaincopy

packagecom.sc.demo.common;
/**
*?@author?SunnyCoffee
*?@date?2014-1-27
*?@version?1.0
*?@desc?desc?公共常量
*
*/
publicclassCommon?{
publicstaticfinalString?LOCATION?="location";
publicstaticfinalString?LOCATION_ACTION?="locationAction";
}
代碼涉及了android的四大組件之三--Activity用爪、Service、BroadcastReceiver 胁镐。
Activity啟動(dòng)后啟動(dòng)了Service偎血,Service是用來(lái)定位的,在Service定位結(jié)束后發(fā)送廣播到BroadcastReceiver盯漂,這里的BroadcastReceiver是作為Activity的內(nèi)部類(lèi)颇玷,所以并不能過(guò)AndroidManifest.xml進(jìn)行注冊(cè),所以采用了方法registerReceiver就缆。而定位就是通過(guò)注冊(cè)監(jiān)聽(tīng)執(zhí)行回調(diào)獲得帖渠。
項(xiàng)目源碼下載地址http://download.csdn.net/detail/limb99/6888499。項(xiàng)目編碼utf-8
注:demo只寫(xiě)了簡(jiǎn)單的功能竭宰,沒(méi)有做容錯(cuò)空郊。比如,功能實(shí)現(xiàn)需要有網(wǎng)絡(luò)和GPS支持切揭,需要開(kāi)啟“位置服務(wù)”(也有的是位置與安全狞甚,不同手機(jī)不同系統(tǒng)略有區(qū)別)。在資源評(píng)論里有人說(shuō)定位不到伴箩,我想很可能就是沒(méi)有開(kāi)啟位置相關(guān)的服務(wù)入愧。自己做過(guò)測(cè)試通過(guò),機(jī)型為 Sony st27i,Coolpad 5891Q,Galaxy S4 GT-i9500嗤谚,虛擬機(jī)未測(cè)試棺蛛。
更新2014-12-03
自己在測(cè)試的時(shí)候發(fā)現(xiàn)有的機(jī)型不能定位,自己手中機(jī)型較少所以無(wú)法確定具體問(wèn)題巩步。
其中一個(gè)機(jī)型Coolpad 5217旁赊,Android4.3。現(xiàn)在還沒(méi)有解決方案椅野,方法慎用终畅。
一些定位思想可以參見(jiàn)http://blog.csdn.net/limb99/article/details/8765584