柚子快報邀請碼778899分享:Android-獲取定位
柚子快報邀請碼778899分享:Android-獲取定位
在Android應(yīng)用開發(fā)中往往要獲取手機定位功能,我是一名Android開發(fā)初學(xué)者,本篇主要記錄了我學(xué)習(xí)如何獲取定位的學(xué)習(xí)筆記,希望可以給大家以幫助。
本篇參考
首先我也是先查找了相關(guān)的帖子,這是我主要參考的一篇,他是直接在Activity中進(jìn)行了
如何獲取定位權(quán)限和手機定位服務(wù)。因為我是為了要做天氣預(yù)報項目獲取當(dāng)前位置信息,所以全放在Activity中比較臃腫,就采用了Service獲取服務(wù)。
ok話不多說上步驟、上代碼
步驟:
創(chuàng)建服務(wù)->在Activity中獲取定位所需權(quán)限->啟動服務(wù)->服務(wù)運行->得經(jīng)緯度
獲取定位AndroidManifest.xml常需要這兩個權(quán)限:
1、創(chuàng)建LocationService
?首先聲明一個位置管理器(獲取定位),和一個定位提供方(如:GPS/網(wǎng)路)。
private LocationManager locationManager;//位置管理器
private String locationProvider = null;//GPS定位值就是"gps"
?先寫功能其它先不管(初學(xué)很復(fù)雜一步一步來):
?1.1、獲取定位getLocation()
先解釋一下權(quán)限的判斷:
通常用ContextCompat 和ActivityCompat 的checkSelfPermission(Context context, int? permission)來獲取permission的授予狀態(tài),返回值是int,如果結(jié)果和PackageManager.PERMISSION_GRANTED(一個常量權(quán)限被授予的意思)相等就代表該permission已經(jīng)獲取了。
locationManager.requestLocationUpdates(String provider , long minTime , float minDistance , LocationListener listener?)參數(shù):
provide:定位提供者(gps,數(shù)據(jù)或wifi,passive)
minTime(ms):多久更新一次位置
minDistance(m):移動多遠(yuǎn)(位移)更新一次位置
listener:很明顯監(jiān)聽用的,minTime和minDistance都需要監(jiān)聽,并且兩者是”|“關(guān)系。
獲取天氣信息沒必要頻繁地獲取定位,如果在minTime之內(nèi)再次獲取定位,那么就取上次獲取地位置就可以了。
private void getLocation() {
//粗略定位權(quán)限是否獲取
boolean FINE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
//精確定位權(quán)限是否獲取
boolean COARSE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
if (FINE_LOCATION && COARSE_LOCATION) {
//獲取上次請求到的位置
Location location = locationManager.getLastKnownLocation(locationProvider);
if (location == null) {//第一次請求、沒有上一次
locationManager.requestLocationUpdates(locationProvider, 30000, 500, locationListener);
} else {
double Longitude = location.getLongitude();
double Latitude = location.getLatitude();
ToastUtil.show(this, Longitude + " " + Latitude);
Log.v("wang", "獲取上次的位置-經(jīng)緯度:" + Longitude + "," + Latitude);
}
} else ToastUtil.show(this, "未獲取定位權(quán)限");
}
getLocation()需要兩個值:locationProvider和locationListener。?
1.2、獲取定位提供者。
?獲取位置提供者:
private void getLocationProvider() {
List
Log.v("wang", "位置提供者包含:" + providers.toString());
if (providers.contains(LocationManager.GPS_PROVIDER)) {
//如果是GPS
locationProvider = LocationManager.GPS_PROVIDER;
Log.v("wang", "定位方式:" + locationProvider);
} else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
//如果是Network
locationProvider = LocationManager.NETWORK_PROVIDER;
Log.v("wang", "定位方式:" + locationProvider);
} else {
ToastUtil.show(this, "沒有可用的定位提供者");
}
}
1.3、創(chuàng)建位置監(jiān)聽:
private LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(@NonNull Location location) {
double Longitude = location.getLongitude();
double Latitude = location.getLatitude();
//如果位置發(fā)生變化,重新顯示地理位置經(jīng)緯度
Log.v("wang", "監(jiān)視地理位置變化-經(jīng)緯度:" + Longitude + "," + Latitude);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
LocationListener.super.onStatusChanged(provider, status, extras);
}
@Override
public void onProviderEnabled(@NonNull String provider) {
LocationListener.super.onProviderEnabled(provider);
}
@Override
public void onProviderDisabled(@NonNull String provider) {
LocationListener.super.onProviderDisabled(provider);
}
};
這樣我們的功能部分就完成了。
2、在Activity中給定位權(quán)限授權(quán)和檢查授權(quán)
2.1、檢查授權(quán)
//檢查定位權(quán)限是否已獲取
private boolean checkLocationPermission() {
//粗略定位權(quán)限是否獲取
boolean FINE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
//精確定位權(quán)限是否獲取
boolean COARSE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
return FINE_LOCATION && COARSE_LOCATION;//是否都已獲取
}
2.2、請求授權(quán)
//請求定位權(quán)限
private void requestLocationPermission() {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);
}
??其中地LOCATION_CODE(這里自定義為20)是用來標(biāo)記這次權(quán)限請求的,在處理請求結(jié)果中以此辨別是是哪個請求
2.3、處理授響應(yīng)
//重寫權(quán)限請求的回調(diào)方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//定位權(quán)限請求
switch (requestCode) {
case LOCATION_CODE://定位權(quán)限請求
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
ToastUtil.show(this, "定位權(quán)限已獲取");
startLocationService();
} else {
ToastUtil.show(this, "定位權(quán)限獲取失敗");
}
break;
}
}
private void startLocationService(){
Intent intent = new Intent(this, LocationService.class);
startService(intent);
}
3、在合適地地方啟動service:
if (checkLocationPermission()){
Log.v("wang","已獲取權(quán)限");
startLocationService();
}
else
requestLocationPermission();
歐克、權(quán)限請求和服務(wù)啟動也做好了,但是還沒結(jié)束
4、啟動服務(wù)時執(zhí)行任務(wù)
現(xiàn)在還不能得到結(jié)果:我們用startService(intent)啟動了服務(wù),還沒要讓服務(wù)做什么。
4.1我們需要重寫服務(wù)地onStartCommand()方法,在啟動服務(wù)時執(zhí)行任務(wù)。
//重寫服務(wù)的啟動時回調(diào)方法
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//1.獲取位置管理器
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//2.獲取定位提供者GPS/網(wǎng)絡(luò)
getLocationProvider();
//3.獲取位置(經(jīng)緯度)
//粗略定位權(quán)限是否獲取
boolean FINE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
//精確定位權(quán)限是否獲取
boolean COARSE_LOCATION = ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) ==PackageManager.PERMISSION_GRANTED;
Log.v("wang","粗略定位:"+FINE_LOCATION +"精確定位:"+ COARSE_LOCATION);
if(FINE_LOCATION && COARSE_LOCATION){
getLocation();
}else {
ToastUtil.show(this,"未獲取定位權(quán)限");
stopSelf();
}
return START_STICKY;
}
4.2再重寫服務(wù)的onDestroy()方法,在停止服務(wù)時進(jìn)行銷毀,并移除位置監(jiān)聽
@Override
public void onDestroy() {
super.onDestroy();
locationManager.removeUpdates(locationListener);
}
private void destroyLocationService(){
Intent intent = new Intent(this, LocationService.class);
stopService(intent);
}
?這樣我們就可以在Activity中合適的地方啟動和銷毀該服務(wù)了
運行結(jié)果:
這里沒有獲取地理位置,想知道怎么獲取的可以看地上方的參考篇。
呼~放松一下
柚子快報邀請碼778899分享:Android-獲取定位
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。