android定位的實(shí)現(xiàn)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市竟闪,隨后出現(xiàn)的幾起案子离福,更是在濱河造成了極大的恐慌,老刑警劉巖炼蛤,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妖爷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡理朋,警方通過(guò)查閱死者的電腦和手機(jī)絮识,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)绿聘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人次舌,你說(shuō)我怎么就攤上這事熄攘。” “怎么了彼念?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵挪圾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我国拇,道長(zhǎng)洛史,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任酱吝,我火速辦了婚禮,結(jié)果婚禮上土思,老公的妹妹穿的比我還像新娘务热。我一直安慰自己,他們只是感情好己儒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布崎岂。 她就那樣靜靜地躺著,像睡著了一般闪湾。 火紅的嫁衣襯著肌膚如雪冲甘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天途样,我揣著相機(jī)與錄音江醇,去河邊找鬼。 笑死何暇,一個(gè)胖子當(dāng)著我的面吹牛陶夜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裆站,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼条辟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了宏胯?” 一聲冷哼從身側(cè)響起羽嫡,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肩袍,沒(méi)想到半個(gè)月后杭棵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡了牛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年颜屠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辰妙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甫窟,死狀恐怖密浑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粗井,我是刑警寧澤尔破,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站浇衬,受9級(jí)特大地震影響懒构,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耘擂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一胆剧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧醉冤,春花似錦秩霍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至螺捐,卻和暖如春颠悬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背定血。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工赔癌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糠悼。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓届榄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親倔喂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铝条,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容