2016-03-15 29 views
7

剛剛收到運行Marshmallow(6.0.1)的Galaxy S7(Edge),並發現它與使用android.permission.ACCESS_COARSE_LOCATION和目標的應用程序有關Sdk版本22(棒棒糖)。當我呼叫locationManager.getLastKnownLocation()時,它總是返回NULL。下面是我運行:LocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)總是在Galaxy S7上返回NULL(僅限於)

public Location getLastKnownLocationObject(Context context) { 

    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

    try { 
     if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
      Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      // Location is always null on S7 (only) 
      Log.i(TAG, ">>> getLastKnownLocationObject() getLastKnownLocation: " + location); 
      return location; 
     } 

    } catch (Exception e) { 
     Log.e(TAG, ">>> getLastKnownLocationObject() exception", e); 
    } 
    return null; 

} 

此相同的代碼工作我已經試過所有其他設備上的罰款:銀河S5(5.0.1)的Nexus 7(5.0.1版),Nexus 9(6.0.1 )和Samsung Tab3(4.4.2)

請注意,如果我更改清單以使用ACCESS_FINE_LOCATION,上面的代碼在每個設備上都能正常工作。不幸的是,管理層目前不允許我更改權限。

在我看到的一些答案中,建議在執行getLastKnownLocation()之前調用以下內容,但這沒有任何效果。

locationManager.requestLocationUpdates(
         LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() { 
          @Override 
          public void onStatusChanged(String provider, int status, Bundle extras) { 
          } 

          @Override 
          public void onProviderEnabled(String provider) { 
          } 

          @Override 
          public void onProviderDisabled(String provider) { 
          } 

          @Override 
          public void onLocationChanged(final Location location) { 
           // NEVER CALLED on Samsung S7 for LocationManager.NETWORK_PROVIDER 
          } 
         }); 

所以目前,我覺得這是一個獨家新的三星Galaxy S7的問題。

+0

您是否以編程方式嘗試請求權限,因爲Marshmallow引入了運行時權限模型? –

+0

我的應用程序目標是22(棒棒糖)。 minSdkVersion 19 targetSdkVersion 22 – GaryAmundson

+0

您必須專門請求Android棉花糖及以上權限。檢查我的這篇文章 - http://stackoverflow.com/questions/35856432/asking-for-permissions-while-using-locationmanager/35857017#35857017 –

回答

2

那麼,你打電話isProviderEnabled()至少這是覆蓋,並使用網絡位置應啓用。然而,documentation確切的寫法是:

「如果用戶已啓用該供應商在設置菜單中,真正是 返回,否則返回false」

所以它只是提供者是「啓用」,因爲沒有被用戶關閉。

問題手機(S7)內部是否有SIM卡?在特定設備上,基於網絡的定位可能需要SIM卡或互聯網連接。

談到了documentation你可以檢查一下這些回報:

locationManager.getProvider(LocationManager.NETWORK_PROVIDER).requiresCell(); 
locationManager.getProvider(LocationManager.NETWORK_PROVIDER).requiresNetwork(); 

當然只是打電話getLastKnownLocation(),並且將返回null如果該位置是未知的。如果沒有應用程序(您的或其他)明確請求設備確定其位置,則不得而知。所以建議撥打requestLocationUpdates()是正確的建議。但可能需要一段時間才能確定位置,因此可能仍然返回null之後立即致電getLastKnownLocation()

即使它返回一些東西,它可能是非常舊的數據,甚至不再有效。那麼爲什麼不只是subscribe to receive location updates?這是它的目的。您正在使用基於網絡的定位,因此它不會(完全/顯着)影響功耗,如果您指定適合您需要的時間間隔和距離限制,則更新不會太頻繁。

+0

感謝您的幫助...現在有兩個不同的銀河S7,我已經能夠測試,都是功能齊全的手機與互聯網接入(並在兩個不同的運營商,這並不意味着什麼)。我沒有問題獲得與其他應用程序的GPS座標。請注意,如果我將權限更改爲ACCESS_FINE_LOCATION,則不存在任何問題。 我確實嘗試了.requiresCell()和.requiresNetwork(),有趣的是它們都在S7上返回True,但是這兩個調用在我測試的所有其他設備上返回false。 – GaryAmundson

+0

(我不需要訂閱更新,因爲我只需要一個天氣應用程序的粗略位置) – GaryAmundson

+0

一旦您收到了新的和最新的位置,您當然可以調用'removeUpdates()' 'onLocationChanged()'回調,你不會收到進一步的更新。這將是getLastKnownLocation()返回null時的解決方案。 –

2

從我的三星設備的經驗。如果您重新啓動手機,並且不啓用GPS,您將無法獲得位置信息。如果您啓用GPS作爲某點 - 也許通過運行Google地圖,那麼您將獲得一個位置。三星不會爲GPS,網絡或被動提供商返回一個位置,除非它在設備開機循環期間獲得了位置。

我在代碼中所做的任何調用都不會讓它啓動並激活並獲取一個位置。他們在其他設備上工作良好。三星似乎也無法長時間緩存這些信息。