1

getLastLocation()在我的6.0 Nexus 7平板電腦上手機位置關閉時返回NULL,但它在其他設備上無GPS功能。爲什麼是這樣以及如何解決它?我想保持GPS關閉,只需使用網絡獲取位置。Android:Google Fused位置在位置關閉時不起作用

下面是我使用來獲得位置類:

public class GPSCenter { 
public static GoogleApiClient mGoogleApiClient; 
public static Location mLastLocation; 
private static Context mContext; 

static GoogleApiClient.ConnectionCallbacks ccb = new GoogleApiClient.ConnectionCallbacks() { 

    @Override 
    public void onConnectionSuspended(int arg0) { 
    } 

    @Override 
    public void onConnected(Bundle arg0) { 

     if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 

     LocationRequest mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_NO_POWER); 

     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    } 
}; 
static GoogleApiClient.OnConnectionFailedListener odfl = new GoogleApiClient.OnConnectionFailedListener() { 
    @Override 
    public void onConnectionFailed(ConnectionResult arg0) { 
    } 
}; 

public static synchronized void buildGoogleApiClient(Context c) { 
    try { 

     mContext = c; 
     mGoogleApiClient = new GoogleApiClient.Builder(c) 
       .addConnectionCallbacks(ccb) 
       .addOnConnectionFailedListener(odfl) 
       .addApi(LocationServices.API) 
       .build(); 

     mGoogleApiClient.connect(); 
    } catch (Exception ex) { 
     Log.i("location", "error " + ex.toString()); 
     ex.printStackTrace(); 
    } 
} 

public static double getLatitude(Context c) { 
    try { 
     return mLastLocation.getLatitude(); 
    } catch (Exception ex) { 
     return 0.0; 
    } 
} 

public static double getLongitude(Context c) { 
    try { 
     return mLastLocation.getLongitude(); 
    } catch (Exception ex) { 
     return 0.0; 
    } 
} 
} 
+0

您是否找到任何解決方案 –

+0

@ M.Yogeshwaran yes請檢查下面的答案:) –

回答

0

這是不是因爲GPS的事情,但,在Location Settings未在設備沒有啓用,它是你的設備設置>谷歌>服務>位置,或設置>隱私&安全>位置,或者只是設置下>位置。我很困惑,因爲在某些設備中,下拉狀態欄顯示GPS啓用按鈕,一些顯示位置啓用按鈕。 有一種方法可以自動啓用位置設置(無導航用戶設備設置),它解決了我的問題,希望它可以幫助你:

GoogleApiClient連接後,做一個位置設置檢查如下:

public static GoogleApiClient mGoogleApiClient; 
private static PendingResult<LocationSettingsResult> result; 
private static LocationSettingsRequest.Builder builder; 
public static Location mLastLocation; 
public static boolean isLocationON = false; 

public static synchronized void buildGoogleApiClient(Activity a, Context c) { 

    try { 

     mActivity = a; 
     mContext = c; 
     mGoogleApiClient = new GoogleApiClient.Builder(c) 
       .addConnectionCallbacks(ccb) 
       .addOnConnectionFailedListener(odfl) 
       .addApi(LocationServices.API) 
       .build(); 

     builder = new LocationSettingsRequest.Builder() 
       .addLocationRequest(locationRequest); 
     builder.setAlwaysShow(true); 

     mGoogleApiClient.connect(); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

private static GoogleApiClient.ConnectionCallbacks ccb = new GoogleApiClient.ConnectionCallbacks() { 

    @Override 
    public void onConnected(Bundle arg0) { 
     checkLocationSettings(); 
    } 

    @Override 
    public void onConnectionSuspended(int arg0) { 
    } 
}; 

private static void checkLocationSettings() { 

    result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); 

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 

     @Override 
     public void onResult(@NonNull LocationSettingsResult locationSettingsResult) { 
      final Status status = locationSettingsResult.getStatus(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 

        isLocationON = true; 

        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
         return; 
        } 
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

        if (mLocationSettingsListener != null) { 
         mLocationSettingsListener.onLocationON(); 
        } 

        break; 

       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 

        isLocationON = false; 

        try { 
         // This line will check the result and prompt a dialog if the device location settings is not enabled 
         status.startResolutionForResult(mActivity, REQUEST_CHECK_SETTINGS); 

        } catch (IntentSender.SendIntentException e) { 
        } 
        break; 

       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        isLocationON = false; 
        // Location settings are unavailable so not possible to show any dialog now 
        if (mLocationSettingsListener != null) { 
         mLocationSettingsListener.onLocationError(); 
        } 
        break; 
      } 
     } 
    }); 
} 
+0

謝謝@BeeingJK有可能在後臺運行這個東西 –

+0

你可以使用一個服務在後臺運行它。位置服務的一個即時例子[這裏](http://stackoverflow.com/a/34919769/4665578)(我從來沒有嘗試過),它包括谷歌播放服務檢查和位置更新偵聽器的功能,你可以做同樣的事情在連接GoogleApiClient之後,請求位置之前檢查「checkLocationSettings」。但對於'startResolutionForResult',你可能需要一個dialogActivity,因爲它需要一個活動來提示對話。爲了簡化它,我只是把東西放在課堂上,然後從活動中調用,並在位置ON時撥打電話 –

+1

@BeeingJk但是,您的問題是如何在不啓用GPS的情況下獲取位置。但是,您在此啓用gps.is'nt它? –

0

通過谷歌阿比我認爲這是不可能的。爲此,您需要使用一些API來進行IP地理定位,或者您可以使用MNC-Mobile網絡位置或MCC移動國家代碼。 它可能會幫助你。

+0

感謝您的回覆,您的'不可能'意味着Google Fused Location無法在沒有GPS的情況下獲取設備位置?但它適用於其他設備 –

0

釷以下說明不返回任何位置值部分:
LocationRequestPRIORITY_NO_POWER

沒有位置將被退回,除非不同的客戶端請求 位置更新在這種情況下,該請求將作爲一個被動的聽衆 到這些位置。

FusedLocationProvider對於,

no explicitly unique source is specified anywhere within documentation

因此,要獲得沒有啓用GPS的位置,您可以信任PRIORITY_BALANCED_POWER_ACCURACY。從我所觀察到的,只有PRIORITY_HIGH_ACCURACY強制使用GPS。

平板電腦可能只有wifi,或者沒有與其他設備不同的SIM卡,可以排除其他應用獲取位置的場景 - 可能使用網絡。

+0

感謝您的解釋,我用'PRIORITY_BALANCED_POWER_ACCURACY'取代了'PRIORITY_NO_POWER',但平板電腦仍然在其位置關閉時返回NULL,對此有何看法? –

0

您必須在模擬器中將位置準確性設置爲僅設備。模擬器中的FusedLocationProviderApi不適用於高精度或省電模式。