2017-02-15 76 views
1

因此,正如我在問題中所述,我正在實施位置服務(谷歌而不是android版本),我試着從方法敬酒,看到它被稱爲,但我沒有任何運氣。如果我刪除它,雖然我得到這一行的錯誤,因此不能要求位置更新谷歌播放服務位置監聽器沒有被調用,但程序仍然需要它的工作?

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

是位置監聽器庫或東西的一部分?我只是不明白爲什麼應用程序不會在我改變位置時敬酒。我研究了很多,但找不到答案,所以我在這裏問。它正在拾取一個位置並烘烤我的handleNewLocation方法中的緯度。

這裏是我的代碼

package com.example.mick.mylocation; 

import android.app.Activity; 
import android.content.IntentSender; 
import android.location.Location; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.util.Log; 
import android.widget.Button; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.maps.GoogleMap; 

public class MainActivity extends Activity implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, 
     LocationListener 
     { 
    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 
    private LocationRequest mLocationRequest; 

    private GoogleApiClient mGoogleApiClient; 
    public static final String TAG = MainActivity.class.getSimpleName(); 

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

     mLocationRequest = LocationRequest.create() 
       .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
       .setInterval(10 * 1000)  // 10 seconds, in milliseconds 
       .setFastestInterval(1 * 1000); // 1 second, in milliseconds 


     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onPause() { 
     Toast.makeText(getApplicationContext(),"PAUSED ", Toast.LENGTH_LONG).show(); 

     super.onPause(); 
     if (mGoogleApiClient.isConnected()) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 

      Toast.makeText(getApplicationContext(), "Location services conntected", Toast.LENGTH_LONG).show(); 
      Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
      if (location == null) { 
       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
      } else { 
       handleNewLocation(location); 
      } 

     } 


    private void handleNewLocation(Location location) { 
     Toast.makeText(getApplicationContext(),"HANNDLE NEW LOCATION METHOD lat is "+location.getLatitude(), Toast.LENGTH_LONG).show(); 


    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Toast.makeText(getApplicationContext(),"SUSPENDED", Toast.LENGTH_LONG).show(); 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

     if (connectionResult.hasResolution()) { 
      try { 
       // Start an Activity that tries to resolve the error 
       connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST); 
      } catch (IntentSender.SendIntentException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode()); 
      Toast.makeText(getApplicationContext(),"Location services connection failed with code " + connectionResult.getErrorCode(), Toast.LENGTH_LONG).show(); 

     } 

    } 


    @Override 
    public void onLocationChanged(Location location) { 
     Toast.makeText(getApplicationContext(),"ON LOCATION CHANGED METHOD", Toast.LENGTH_LONG).show(); 

//  handleNewLocation(location); 
    } 

} 

感謝

回答

0

我的猜測是,你永遠在做onConnect()第一requestLocationUpdates()。僅僅因爲你新近連接並不意味着getLastLocation()將爲空。事實上,你希望不會讓顯示器儘快更新。

試試這個:

if (location != null) { 
     handleNewLocation(location); 
    } 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

它不會傷害到你連接一個新的requestLocationUpdates()每次發送。 (實際上,我認爲如果配置更改導致您斷開連接&重新連接到GoogleApiClient,則需要發送新請求)

+0

處理googleApiClients我試過,代碼雖然它仍然沒有從onLocationChanged方法 –

+0

這工作我的設備上做了烤麪包。您確定您的手機上已啓用「位置」功能嗎? – Gary99

+0

我意識到我需要運行這個服務,所以我最終改變了代碼,所以它現在工作正常由於某種原因 –

-1

如果我是你,我會從不必要的樣板和頭疼通過使用ReactiveLocation:

public class MainActivity extends Activity { 

    public static final String TAG = MainActivity.class.getSimpleName(); 
    private Subscription subscription; 

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

     mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setInterval(10 * 1000)  // 10 seconds, in milliseconds 
      .setFastestInterval(1 * 1000); // 1 second, in milliseconds 


     ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(context); 
     subscription = locationProvider.getUpdatedLocation(mLocationRequest) 
      .subscribe(new Action1<Location>() { 
       @Override 
       public void call(Location location) { 
        //This will be called every time a new location is received 
        Toast.makeText(getApplicationContext(), "Location updated", Toast.LENGTH_LONG).show(); 
       } 
      }); 

    } 

    @Override 
    public void onPause() { 
     //Make sure to stop listening for updates when you don't need them anymore 
     subscription.unsubscribe(); 
    } 
} 
+0

你是對的,我應該包括在首位。 – Juuso

相關問題