Android打開GPS導(dǎo)航并獲取位置信息返回null解決方案
最近在做一個(gè) Android 項(xiàng)目,需要用到GPS獲取位置信息,從 API 查了一下,發(fā)現(xiàn)獲取位置信息僅需極其簡單的一句即可:
getLastKnownLocation(LocationManager.GPS_PROVIDER),
于是高興地不得了??墒且粚戇M(jìn)代碼里,返回值(Location 類型)居然一直為null..郁悶的不得了。在網(wǎng)上查了好久,發(fā)現(xiàn)好多人都和我一樣糾結(jié)于這個(gè)問題上,有人說是因?yàn)镚PS沒打開,也有人說是相關(guān)權(quán)限沒加上..可是我的明明已經(jīng)在設(shè)置里打開,權(quán)限自然也加上了。在api上糾結(jié)了半天,終于找出原因了,原來要打開GPS其實(shí)在于這句:
setTestProviderEnabled("gps",true);
而跟手機(jī)上的設(shè)置沒多大關(guān)系(起碼在我的手機(jī)上測是這樣的)。手機(jī)上的設(shè)置關(guān)閉了,這一句照樣能打開;而即使手機(jī)設(shè)置打開了,沒這一句也是白搭。與這句對應(yīng)的是
setTestProviderEnabled("gps",false);
用來關(guān)閉GPS.
GPS打開后可以用上面的方法獲取Location了嗎?還是不可以!確切地說是有時(shí)候可以,因?yàn)檫@個(gè)函數(shù)獲取的是上次已經(jīng)獲得的位置信息,設(shè)想如果此程序第一次跑,先前并沒有獲取過位置信息,當(dāng)然返回值為null了。經(jīng)仔細(xì)查看api,在
requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)
里發(fā)現(xiàn)了這樣一句話:It may take a while to receive the most recent location. If an immediate location is required, applications may use the getLastKnownLocation(String) method. 因此為了獲取位置信息,應(yīng)該用此方法為manager設(shè)置監(jiān)聽器,在監(jiān)聽器中onLocationChanged(Location location)里獲取。
測試代碼如下:
public void onLocationChanged(Location location)
{
Log.i("onLocationChanged", "come in");
if (location != null)
{
Log.w("Location","Current altitude = "+ location.getAltitude());
Log.w("Location","Current latitude = "+ location.getLatitude());
}
}
經(jīng)過測試,經(jīng)過一段時(shí)間后可以獲取Location(獲取時(shí)間與minTime、minDistance相關(guān))。還需注意的一個(gè)問題是在設(shè)置了監(jiān)聽器后,刪除監(jiān)聽器之前不能用上面的方法關(guān)閉gps,否則會報(bào)錯(cuò)。因此關(guān)閉gps的方法是
manager.removeUpdates (listener);//listener 即為監(jiān)聽器實(shí)例
manager.setTestProviderEnabled("gps",false);
以下是測試代碼,所需權(quán)限有:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission>
import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
public class audio extends Activity
{
/** Called when the activity is first created. */
LocationManager locationManager;
LocationListener llistener;
String provider;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String serviceName = Context.LOCATION_SERVICE;
locationManager = (LocationManager) getSystemService(serviceName);
locationManager.setTestProviderEnabled("gps", true);
provider = locationManager.getBestProvider(criteria, true);
Log.d("provider", provider);
llistener = new LocationListener() {
@Override
public void onLocationChanged(Location location)
{
// TODO Auto-generated method stub
Log.i("onLocationChanged", "come in");
if (location != null)
{
Log.w("Location", "Current altitude = "
+ location.getAltitude());
Log.w("Location", "Current latitude = "
+ location.getLatitude());
}
locationManager.removeUpdates(this);
locationManager.setTestProviderEnabled(provider, false);
}
@Override
public void onProviderDisabled(String provider)
{
// TODO Auto-generated method stub
Log.i("onProviderDisabled", "come in");
}
@Override
public void onProviderEnabled(String provider)
{
// TODO Auto-generated method stub
Log.i("onProviderEnabled", "come in");
}
@Override
public void onStatusChanged(String provider, int status,
Bundle extras)
{
// TODO Auto-generated method stub
Log.i("onStatusChanged", "come in");
}
};
locationManager.requestLocationUpdates(provider, 1000, (float) 1000.0, llistener);
}
protected void onDestroy()
{
locationManager.removeUpdates(llistener);
locationManager.setTestProviderEnabled(provider, false);
super.onDestroy();
}
- Android GPS定位測試(附效果圖和示例)
- Android實(shí)現(xiàn)GPS定位代碼實(shí)例
- android通過gps獲取定位的位置數(shù)據(jù)和gps經(jīng)緯度
- Android實(shí)現(xiàn)Service獲取當(dāng)前位置(GPS+基站)的方法
- android手機(jī)獲取gps和基站的經(jīng)緯度地址實(shí)現(xiàn)代碼
- Android中GPS定位的用法實(shí)例
- Android中實(shí)現(xiàn)GPS定位的簡單例子
- Android編程獲取GPS數(shù)據(jù)的方法詳解
- Android中GPS坐標(biāo)轉(zhuǎn)換為高德地圖坐標(biāo)詳解
- Android GPS獲取當(dāng)前經(jīng)緯度坐標(biāo)
相關(guān)文章
Android自定義雙向進(jìn)度條的實(shí)現(xiàn)代碼
本篇文章主要介紹了Android自定義雙向進(jìn)度條的實(shí)現(xiàn)代碼,非常具有實(shí)用的價(jià)值,有興趣的同學(xué)一起來了解一下2017-09-09android中AutoCompleteTextView的簡單用法(實(shí)現(xiàn)搜索歷史)
本篇文章主要介紹了android中AutoCompleteTextView的簡單用法(自動(dòng)提示),有需要的可以了解一下。2016-11-11ViewPager實(shí)現(xiàn)輪播圖引導(dǎo)頁
這篇文章主要為大家詳細(xì)介紹了ViewPager實(shí)現(xiàn)輪播圖引導(dǎo)頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Flutter快速制作一個(gè)水印組件實(shí)例詳解
這篇文章主要為大家介紹了Flutter快速制作一個(gè)水印組件實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android自定義動(dòng)態(tài)壁紙開發(fā)(時(shí)鐘)
今天小編就為大家分享一篇關(guān)于Android自定義動(dòng)態(tài)壁紙開發(fā)(時(shí)鐘),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01Android程序開發(fā)之手機(jī)APP創(chuàng)建桌面快捷方式
這篇文章主要介紹了Android程序開發(fā)之手機(jī)APP創(chuàng)建桌面快捷方式 的相關(guān)資料,需要的朋友可以參考下2016-04-04Android 監(jiān)聽WiFi的開關(guān)狀態(tài)實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 監(jiān)聽WiFi的開關(guān)狀態(tài)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05Android開發(fā)實(shí)現(xiàn)NFC刷卡讀取的兩種方式
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)中實(shí)現(xiàn)NFC刷卡讀取的兩種方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09