1

我正在嘗試爲我正在處理的應用程序獲取我的位置。但是,我收到一個錯誤,然後在嘗試選擇最佳提供程序時強制關閉。任何關於這個問題的幫助將不勝感激......我需要在onCreate中聲明一些東西以使其工作嗎?這裏是跟該錯誤的代碼片段:ANDROID:幫助LocationProvider

public void onStart(){ 
    super.onStart(); 
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    best = locationManager.getBestProvider(criteria, true);//Selects best location provider given options between GPS and poor man's 
    locationProvider = locationManager.getProvider(best); 

     if (locationProvider != null) { 
      locationManager.requestLocationUpdates(locationProvider.getName(), 60000, 1, 
       this.locationListenerRecenterMap); 
     } else { 
      Log.e(TAG, "NO LOCATION PROVIDER AVAILABLE"); 
      Toast.makeText(this, "The GPS location provider is not available at this time.", Toast.LENGTH_SHORT).show(); 
      finish(); 
     } 

    GeoPoint location = this.getLastKnownPoint(); 
    this.mapController.animateTo(location); 
} 
public void onResume(){ 
    super.onResume(); 
    locationManager.requestLocationUpdates(best, 15000, 1, (LocationListener) this); 
} 
public void onPause(){ 
    locationManager.removeUpdates((LocationListener) this); 
} 
private GeoPoint getLastKnownPoint(){ 
    GeoPoint lastKnownPoint = GeoUpdateHelper.SCRANTON; 
    Location lastKnownLocation = this.locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    if(lastKnownLocation != null){ 
    lastKnownPoint = GeoUpdateHelper.getGeoPoint(lastKnownLocation); 
    }else{ 
     lastKnownPoint = GeoUpdateHelper.SCRANTON; 
    } 
    return lastKnownPoint; 
} 

這裏是錯誤:

04-16 19:07:25.077: ERROR/AndroidRuntime(4998): Caused by: java.lang.IllegalArgumentException: name==null 
04-16 19:07:25.077: ERROR/AndroidRuntime(4998):  at android.location.LocationManager.getProvider(LocationManager.java:324) 
04-16 19:07:25.077: ERROR/AndroidRuntime(4998):  at com.example.mapMain.onStart(mapMain.java:76) 

編輯:這是我的OG的Droid運行。當我點擊打開獲取強制關閉位置的應用程序的地圖部分時。

回答

4

該錯誤表示沒有找到最佳提供者,並且對getBestProvider()的調用返回null。

儘管您沒有真正指定任何標準,但可以預料此調用至少會返回「某些內容」。 javadocs有點模糊,並沒有提到這個方法可以返回null。 (看看source code,它實際上可以返回null)

但是,您的應用程序/設備可能沒有任何可用的提供程序。 您可以執行以下調用來檢查它是否返回任何提供程序(它將返回所有啓用的提供程序,而不考慮任何條件)?

locationManager.getProviders(true) 

假設這是應用程序的限制,要仔細檢查您已經定義了以下權限,因爲他們將被要求返回某種提供商。

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
+0

我確實有這些權限確定...也粗略的位置。我只是沒有看到它出錯的地方... – 2011-04-16 23:42:19

+0

這是模擬器還是真實設備?並且在仿真器/設備上啓用了提供程序嗎? – ddewaele 2011-04-16 23:46:57

+0

呃。我遇到同樣的問題。我注意到谷歌的一件事情是,似乎有一個假設,如果有問題,他們的廢話將返回null,但我不確定這種行爲是否已經明確 – 2013-03-18 12:48:41

0

在我來說,我是測試未在系統設置(谷歌定位服務,獨立GPS服務,VZW位置的服務)功能的任何位置服務的設備上。因此requestLocationUpdates正在導致應用程序崩潰。我在try/catch塊中包含了該代碼,該應用程序不再崩潰。

+0

對不起,你的意思是圍繞它一個catch塊?我希望你沒有趕上IllegalArgumentException ... 儘管這是不好的風格,你可以通過檢查你是否提供NULL來避免它。這也可以節省你的性能,因此java處理簡單的檢查比跳入catch-block更有效 – Chris 2013-06-19 20:52:07

+0

我聽到你對代碼風格的看法。但在這種情況下的績效效率是疏忽大意的。 – 2013-06-20 16:32:17

+1

我很清楚,有些情況下性能最重要 - 但異常處理很昂貴,所以 - 如果可以的話 - 嘗試檢查參數以避免異常比獲取異常更快。 一些更精確的討論一直在http://stackoverflow.com/questions/299068/how-slow-are-java-exceptions 對於IAE:也許這可以幫助你? http://stackoverflow.com/questions/9990129/illegalargumentexception-thrown-by-requestlocationupdate – Chris 2013-06-26 12:37:53