1. 程式人生 > >android獲取位置location為null的問題

android獲取位置location為null的問題

很多人經常遇到這種問題,主要是獲取到位置的資訊為null,第一個主要要有許可權  

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>

第二個我們呼叫的方法是 Location location = locationManager.getLastKnownLocation(provider);

 這個方法主要是獲取上一次的經緯度資訊,上一次的話肯定是空的啦。。這是要註冊一下獲取事件的監聽器

等一會以後就可以拿到了經緯度了。。所以說一開始不要著急獲取經緯度。。等待一會就有了。。不會報空指標異常。

LocationManager locationManager;
   String serviceName = Context.LOCATION_SERVICE;
   locationManager = (LocationManager) con.getSystemService(serviceName); // 查詢到服務資訊
   //locationManager.setTestProviderEnabled("gps", true);
  
   locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, mLocationListener01);
   locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, mLocationListener01);

獲取資料和監聽器

  * 通過location獲取當前裝置的具體位置
   *
   * @param location
   * @param rowId
   * @param params
   * @param rowId
   */
 private Location updateToNewLocation(Location location) {
  System.out.println("--------zhixing--2--------");
   String latLongString;
   double lat = 0;
   double lng=0;
  
   if (location != null) {
    lat = location.getLatitude();
    lng = location.getLongitude();
    latLongString = "緯度:" + lat + "\n經度:" + lng;
    System.out.println("經度:"+lng+"緯度:"+lat);
   } else {
    latLongString = "無法獲取地理資訊,請稍後...";
   }
   if(lat!=0){
    System.out.println("--------反饋資訊----------"+ String.valueOf(lat));
   }
  
   Toast.makeText(getApplicationContext(), latLongString, Toast.LENGTH_SHORT).show();
 
   return location;
  
 }
  
      // 設定監聽器,自動更新的最小時間為間隔N秒(1秒為1*1000,這樣寫主要為了方便)或最小位移變化超過N米
 public final LocationListener mLocationListener01 = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            updateToNewLocation(location);
        }
   

        @Override
        public void onProviderDisabled(String provider) {
         updateToNewLocation(null);
        }

        @Override
        public void onProviderEnabled(String provider) {}

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {}
};
經過測試。。沒有問題。。希望幫到你們。。。

在使用LocationManager.getLastKnownLocation("gps")獲取gps定位的過程中老是報空指標異常 

在網上百度查了不少資料發現這個問題多出現在2.0以上版本 
解決方法多是: 
1.在AndroidManifest.xml中新增 

Xml程式碼  收藏程式碼
  1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  2. <uses-permission android:name="android.permission.INTERNET" />  
  3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  

2.在emulator control中手動設定經緯度 

但是我的程式這些都寫了依舊報空指標 

後來在外國論壇上終於找到一些啟發 
一個哥們這樣寫程式碼 
Java程式碼  收藏程式碼
  1. LocationManager mgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
  2. Location location = mgr.getLastKnownLocation(bundle.getString("provider"));  
  3. while(location  == null)  
  4. {  
  5.   mgr.requestLocationUpdates("gps"600001, locationListener);  
  6. }  

我試了一下還真有效,他的解釋是用debug發現getLastKnownLocation()方法不是一次就能定位的,必須多次才能成功。 

但是顯然這樣用迴圈一直等待很沒效率,所以我重寫了MapActivity的方法 
Java程式碼  收藏程式碼
  1.   /** 
  2.     * 這裡一定要對LocationManager進行重新設定監聽 
  3.     * mgr獲取provider的過程不是一次就能成功的 
  4.     * mgr.getLastKnownLocation很可能返回null 
  5.     * 如果只在initProvider()中註冊一次監聽則基本很難成功 
  6.     */  
  7. @Override  
  8. protected void onResume() {  
  9.     super.onResume();  
  10.     mgr.requestLocationUpdates(bundle.getString("provider"), 600001, locationListener);  
  11. }  
  12. @Override  
  13. protected void onPause() {  
  14.     super.onPause();  
  15.     mgr.removeUpdates(locationListener);  
  16. }  

一樣也成功了。。

在外國技術論壇上找了個解釋,個人感覺很貼切: 

The call to request update for a location is not blocking, hence it wont wait there. Also the provider in emulator may not have been started. 

A possible check could be to see if the settings in it disable gps provider ? then send geo fix. 

However, I would use Location Listener, it would be ideal in your case since you need a geo fix to proceed further.Location Listener is Used for receiving notifications from the LocationManager when the location has changed. You can unregister the listener after first geofix. 

Note: It can take some time on device to get current location, and even on device this can return null. 

相關推薦

android獲取位置locationnull的問題

很多人經常遇到這種問題,主要是獲取到位置的資訊為null,第一個主要要有許可權       <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>       <

Android獲取當前位置,location

     通過最後一次的地理位置來獲得Location物件:location = locationManager.getLastKnownLocation(provider);得出location為空。檢視各種資料發現,getLastKnownLocation僅僅是獲取當快

android 獲取地理位置null

發現有很多android 手機獲取地理位置,很多時候都不一定能夠獲取到,並且不一定準確,因為那個位置都是上次獲取的時候拿到的,得更新。具體實現程式碼如下 import android.app.Activity; import android.content.p

android 網路定位失敗 locationnull的真正原因

  最近開發一個android應用,需要用到定位功能,經過網上查資料發現gps定位速度太慢,遂決定用網路定位,結果在本人的三星手機上除錯發現 locationManager = (LocationManager)this.getSystemService(Context

Android通過findViewById()獲取控制元件NULL

如果在activity中直接呼叫findViewById方法,它的完整形式是this.findViewById().而我所需要的控制元件是不存在本身activity的佈局中的.所以要通過控制元件所在的view呼叫findViewById方法,就可以獲取到正確的控制元件了

Android GPS室內定位問題的解決方法(locationnull

為什麼室內沒有location呢?        因為我們開發的時候幾乎肯定都是在室內的,這個時候衛星你是搜尋不到的,所以必然是定位不了的,所以系統如何將位置資訊通知給你的程式。所以要從根本上解決這個問題,就要解決位置資訊獲取問題。         那麼我來告訴大家,只

Android Gcm 推送時,第一次獲取到registrationIDnull的問題解決

     之前一直沒注意到,在使用谷歌gcm訊息推送服務時,第一次執行,註冊谷歌服務,拿到的registrationID是空的,導致傳給後臺服務就是空的,無法接收到資訊,大概原因是你向谷歌註冊服務,要想立馬獲取registrationID的話,是不確定的,你需要啟動一個執行緒

SpringBoot利用註解@Value獲取properties屬性null

pro 解決 autowired dfs stat info 如何 一個 去掉 參考:https://www.cnblogs.com/zacky31/p/8609990.html 今天在項目中想使用@Value來獲取Springboot中properties中屬性值。

Android問題集錦:getActionBarnull的解決以及ActionBar的Back鍵

我最開始的需求是,修改Actionbar的標題文字,用的方法是, ActionBar actionBar = getActionBar(); 發現這樣獲取的actionbar的例項為null,於是開啟了查詢資料的旅程,找到解決方案如下: 問題原因: Activity基類引起的,當使用

Android 獲取位置資訊(經緯度)(附程式碼)

        獲取位置資訊主要通過GPS和網路位置兩種方法,優先順序還是GPS,有點就不多說了,下面說一下我做的方法及附程式碼,有疑問可在下方留言。        思路便是GPS優先,但在GPS訊號弱的情況下采取拿

百度定位sdk的api使用時獲取地址資訊null的原因

我的情況是這樣的  清單檔案中加了service 加了key的值 在activity的主執行緒中使用了百度定位SDK的api 截圖如下  寫了一個類繼承了BDAbstractLocationListener類 實現了他的方法 設定了SDK的引數 但是我前一天晚上還可以顯示資料 第二天早上起來就顯示為null

與第三方進行聯調測試,對方將JSON形式的引數放到params中,接收請求後獲取引數值null

第三方將引數放入請求體中,請求過來之後,這邊request.getParameter("params")獲取不到引數。第三方用的Content-Type是application/json,在我們的建議下修改為text/html,發現還是不行。但是我們之前自測是沒有問題的,所以

開啟檔案管理時 URI獲取檔案路徑null的解決方法

最近做Android圖片相關的開發,通過intent 得到 URI獲取的檔案路徑為null,正好這篇文章解決了我的問題,mark一下 原文: 今天呼叫系統自帶的FileChooser後,根據Intent返回的uri獲取路徑的時一直返回null。 這個問題很奇怪,最

row.getCell()獲取單元格null,空指標異常

if(row.getCell(j+3) == null){ row.createCell(j+3).setCellValue(new HSSFRichTextString(String.valueOf(resultList.get(j)))); }else {

Redis主從讀資料不一致與hmget()獲取欄位null的問題解析

一、Redis主從讀資料不一致 大家在使用redis的時候,經常會用expire來設定key的過期時間,以為某個key到期就會馬上清除。但在設定為主寫隨機讀時,發現存在key未失效的情況,下面具體分析: 原因一過期策略的問題: 3.2之後的版本已不存在以下問題 Redi

android getLastKnownLocation()獲取當前位置null解決方法

 用Google map api開發是一件令人糾結的事情 使用 getLastKnownLocation() 總是莫名奇妙的獲取不到值,為null,然後又莫名其妙的好了。除錯了半天也沒用,上網找資料,前篇一律的一個答案 所以以後就讓它自生自滅吧。 LocationManag

Android獲取ActionBarnull的問題

由於ActionBar是在android3.0以後引入的,所以必然出現相容的問題。有時候我們在獲取ActionCar的時候出現空指標問題。如果工程是要相容3.0以下的版本(Activity 繼承AppCompatActivity),那麼要import以下: import

SCRIPT5007:無法獲取屬性“show”的值,對象null或沒有定義

dojo show post nbsp gb2 data scrip con style 1、錯誤描寫敘述 SCRIPT5007:無法獲取屬性“show”的值,對象為null或沒有定義 dojo.js,行15.字符11808 2、錯誤原因

Android】getActionBar()null的解決方法總結

andro 調用 種類 ref code trac page 沒有 stack 前言 在使用 ActionBar的時候,有時候會爆出空指針異常,這是由於應用沒有獲取到 ActionBar 導致的,而導致應用沒有獲取到 ActionBar 的原因比較多。

Android 那些年,處理getActivity()null的日子

ble and 自己的 導致 void 解決問題 nat ont 原理 在日常開發中的時候,我們經常會使用ViewPager+Fragment進行視圖滑動,在某些部分邏輯也許我們需要利用上下文Context(例如基本的Toast),但是由於Fragment只是衣服