2014-02-23 196 views
5

我之前發佈過關於此問題的信息,並且發現其他一些人遇到過無法找到解決方案的問題。Android GPS無法工作,直到重新啓動新手機

我正在開發一個Android應用程序,該應用程序使用獲得的GPS座標和地理編碼的郵政編碼向服務器提交JSON查詢。對於從未下載應用程序的全新用戶,GPS不起作用。直到重新啓動手機,GPS才能工作。安裝應用程序然後重新啓動後,即使GPS再次重新啓動,GPS也將毫無問題地工作。

在這個問題上有很少的寶貴信息,我發現的唯一問題是使用Google Play定位服務,但沒有進一步的細節。其他人遇到過這個問題嗎?我的發展完全停止,直到這個問題得到解決。


編輯: 這裏是鏈接到MainActivity.java文件調用地理定位6功能。

這裏是鏈接到MyLocation.java文件,其中包含了地理位置

的多個來源我毫不懷疑,有做GPS的更好的方法實際的邏輯。我對Android開發非常陌生,因此非常感謝這方面的幫助。

編輯2: 我已經用工廠重置擦掉手機,並從頭開始。我仍然無法在此設備上覆制問題,只能在重新啓動之前首次使用該應用的手機上進行復制。

+0

我從來沒有在使用gps的應用中看到過此行爲。您需要提供更多信息。 – Christine

+0

**「直到重新啓動手機,GPS才能正常工作。」** - 我發現這很難相信。你的建議意味着*任何使用GPS的應用程序都需要在安裝應用程序後重啓設備。 – Squonk

+0

@Christine由於重啓後工作,我必須嘗試找到一個設備,我可以重置每個調試周期以複製行爲。今晚可能會有更新,並會隨時更新。 – mattcoker

回答

3

看起來您正在註冊GPS和NETWORK提供程序以偵聽10秒的位置,並且當計時器在10秒後熄滅時,您嘗試從兩個提供程序獲取最新的位置。

這裏有幾件事情正在進行。

首先,您似乎正在偵聽錯誤方法的更新。你的兩個偵聽器應該是這樣的:

LocationListener locationListenerGps = new LocationListener() { 

      // This will never be called, its not part of the LocationListener interface - http://developer.android.com/reference/android/location/LocationListener.html 
      /* public void onStatusChanged(Location location) { 
        timer1.cancel(); 

        locationResult.gotLocation(location); 
        lm.removeUpdates(this); 
        lm.removeUpdates(locationListenerNetwork); 
      } */ 
      public void onProviderEnabled(String provider) {} 
      public void onProviderDisabled(String provider) {} 
      public void onLocationChanged(Location location) { 
        // This is the correct method to receive location callbacks 
        timer1.cancel(); 

        locationResult.gotLocation(location); 
        lm.removeUpdates(this); 
        lm.removeUpdates(locationListenerNetwork); 

      } 
      public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

其次,我會用ScheduledThreadPoolExecutorHandler代替Timer

Timer文檔:

體型的ScheduledThreadPoolExecutor對新代碼......此類不提供有關任務調度的實時性保證。

如果需要重新啓動才能使應用程序正常工作,則可能與定時器在10秒後未觸發​​有關。請注意,這並不一定意味着GPS本身不工作。

Handler應該完成這項工作,它是爲Android設計的,所以我建議使用它。它看起來像:

Handler handler = new Handler(); 
handler.postDelayed(getLastLocation, 10000); 

...和你GetLastLocation將變爲:

Runnable getLastLocation = new Runnable() { 
    @Override 
    public void run() { 
     ... 
    } 
} 

...和你cancel()等方法將需要引用的處理程序。

另外,請注意,您正在使用提供程序類型NETWORK_PROVIDER在MainActivity中聲明Location對象,然後在該對象中設置lat/long。

public Location mUserCoordinates = new Location(LocationManager.NETWORK_PROVIDER); 

所以,在MainActivity位置類型將始終顯示爲的NETWORK_PROVIDER,無論實際的源。

此外,看起來您的MainActivity不需要實現LocationListener,因爲它從未在LocationManager中註冊。

最後,而不是使用兩個偵聽器的GPS和網絡,我會建議使用在谷歌融合的位置提供播放服務,爲這裏討論: http://developer.android.com/training/location/receive-location-updates.html

你會被限制在設備Android 2.2及更高版本並安裝了Google Play服務,但在我看來,這是值得的,以避免處理平臺中某些偏僻的位置並管理多個提供商。有關融合位置服務提供商的更多信息,以及它如何與直接傾聽GPS和NETWORK提供商的差異,請參閱此2013 Google I/O presentation - Beyond the Blue Dot: New Features in Android Location

+0

只要我今晚可以看到更多,我可能會有一些問題給你。這種答案正是我期待的那種東西,雖然深入而完整。 – mattcoker

+0

+ mattcocker我面臨同樣的問題,你找到原因了嗎? –

2

爲什麼使用Google Play服務位置API?

Play Services提供的唯一新功能是Geofencing。從你的答案我假設你不想使用Geofencing,但只是「通常」的位置請求。

Android平臺爲這類不需要Google Play服務的請求提供了一個很好的API。我從來沒有遇到過使用它時描述的問題。

請注意,儘管Google聲稱Play服務比Android API更好,但自API 9(Android 2.3)以來,這並非如此,只要您使用不需要提供商的較新LocationManager.requestLocationUpdates方法即可指定。

請參見:http://developer.android.com/guide/topics/location/strategies.html

+0

感謝您的迴應,我不使用Google Play服務位置API,這是我所指的:[StackOverflow](http://stackoverflow.com/questions/15259229/android-app-not-able-to -get-gps-until-phone-restarts) 我一直在使用Android開發人員門戶上列出的策略,他們工作得很好,只有這個例外。 – mattcoker

2

我曾與正規位置API前面同樣的問題。我向Play Services求助,似乎有效。最近有時我會再次使用Google Play服務遇到此問題。這真的很奇怪,根據我的經驗,probelem是系統範圍的,所以當我的應用找不到位置時,比Google Maps應用無法收集。請注意,我使用Cyanogenmod,因此它可能是一些錯誤。

+0

同樣,我不明白使用Google Play服務在您的位置上獲得GPS修正之間的區別。你能否提供關於如何做到這一點的細節? – mattcoker

+0

如果你正在開發你的應用程序基於此,比你使用它:http://developer.android.com/training/location/index.html – Ripityom