2013-08-07 168 views
13

這是一個已被問了很多次的問題,但我找不到始終有效的解決方案。onLocationChanged未在某些設備上調用

我正在開發一個使用融合位置提供程序的應用程序。 在onConnected()方法中,我請求位置更新,並且一旦生成位置修復並且調用onLocationChanged(),就會啓動應用程序邏輯。 (請參閱下面的我的代碼)。

問題onLocationChanged()方法不會被調用的一些設備。我使用三星Tab 2和三星Galaxy Grand進行測試。此代碼在Tab 2上工作得很好,但在Grand上無效。通過不起作用,我的意思是locationClient獲得連接,但不會調用onLocationChanged()

此前,我使用位置管理器獲取位置,並在該實現中發生了同樣的問題。所以,我試圖實現融合的位置提供商,但我仍然遇到同樣的問題。

任何人都可以幫我解決這個問題嗎?有什麼我在這裏失蹤?

public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, OnConnectionFailedListener, LocationListener { 

LocationClient locationclient; 
LocationRequest lr; 
Location loc1; 
static String address; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);  

    locationclient = new LocationClient(this,this,this); 
    locationclient.connect();   

} 

@Override 
public void onConnected(Bundle arg0) { 
    // TODO Auto-generated method stub 

    lr=LocationRequest.create(); 
    lr.setInterval(100); 
    locationclient.requestLocationUpdates(lr, this); 
    Log.d("LocationClient","On Connected"); 
} 

@Override 
public void onDisconnected() { 
    // TODO Auto-generated method stub 
    locationclient.disconnect(); 

} 

@Override 
public void onConnectionFailed(ConnectionResult arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onLocationChanged(Location loc) { 
    // TODO Auto-generated method stub  

    // Application Logic   

    Log.d("LocationClient","Last Known Location LC:" + loc.getLatitude() + "," + loc.getLongitude()); 
} 
} 
+0

如果onConnected()不會被調用onConnectionFailed()應該被觸發。你看看ConnectionResult? –

+0

正在調用onConnected()並建立連接。我已在兩臺設備上檢查過。在onConnected()我請求位置更新,然後不會導致onLocationChanged調用。 – Rohit

+2

您是否找到解決方法或解決方法?我面臨同樣的問題 – gian1200

回答

0

看看你是否通過測試if(loc == null)來獲得通過的位置。即使它是同一個提供者,也許一個設備會返回null並被轟出,導致看起來不是正在觸發。

+0

檢查沒有幫助。 – Rohit

0

這可能是無意義的,但我以前遇到過這個問題,有人建議你應該創建自己的LocationListener,而不是讓MainActivity實現LocationListener。基本上這個:

locationclient.requestLocationUpdates(lr, your_location_listener); 

希望這會有所幫助。

+0

沒有這也沒有幫助。 – Rohit

0

我解決了這個由兩個參數,最小距離和最小時間更新的間隔設置爲0 按什麼我已經2臺設備,現在onLocationChanged測試()被請求更新後定期調用。

+0

我也開始接觸這種方法。在某些設備上,我無法獲得定位。 – Rohit

0

嘗試刪除並重新安裝「google play services」。從谷歌電子市場鏈接波紋管安裝它, google play services

-1

這裏檢查這個代碼了...

public class MyActivity extends Activity implements LocationListener { 
double destLat, destLong; 

LocationManager locationManager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 

} 

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 
    destLat = location.getLatitude(); 
    destLong = location.getLongitude(); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 
+0

本示例未使用Fused Location API。 –

2

我觀察到的Galaxy Nexus相同的行爲,並承認兩件事情引起onLocationChanged()不被調用。有

  1. 系統設置中未啓用相應的位置源。對於PRIORITY_HIGH_ACCURACY必須啓用GPS衛星,對於PRIORITY_BALANCED_POWER_ACCURACYWi-Fi &移動網絡位置必須啓用。

  2. 即使對於啓用的位置來源,也可能沒有有效的位置信息可用。例如,PRIORITY_HIGH_ACCURACY源已啓用,但沒有(或不好)GPS接收(例如,設備在建築物內)。或者PRIORITY_BALANCED_POWER_ACCURACY源已啓用,但Wi-Fi和移動數據均已關閉。在這些情況下,無法檢測到位置,並且不會調用onLocationChanged()

要解決#1我甚至連接到谷歌服務API之前檢查居民點源是否已啓用,如果他們都關掉,然​​後我通知用戶讓他/她來存取位置。

爲了解決#2我決定使用LocationRequest.setExpirationDuration()。我設置了約10秒的超時時間,並且在呼叫requestLocationUpdates()後立即發送延遲了相同的10秒的回叫。如果延遲迴撥在requestLocationUpdates()之前被調用,這意味着由於原因#2無法檢測到位置。我做了三次重試,然後向用戶顯示一條錯誤消息。

Android文檔在這個地方不是很好,這就是爲什麼我希望這有助於。

+0

您能否爲您的#2解決方案多解釋一下?我不是很瞭解它 – roostaamir

+0

@roostaamir我更新了答案。 –

1
lr.setInterval(100); 

有了它你的間隔是0.1秒,所以它很難讓GPS芯片組檢測到位置。您的間隔應> 1秒(我是> 10)

locationRequest應該設置:

setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 因爲PRIORITY_BALANCED_POWER_ACCURACY在戶外它沒有得到位置。代碼將如下所示:

lr=LocationRequest.create(); 

lr.setInterval(5 * 1000);// 5s 

lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
locationclient.requestLocationUpdates(lr, this); 

希望得到這個幫助。

相關問題