2017-02-05 2 views
-7

퓨즈 위치를 사용하여 장치의 현재 위치를 가져 오지만 구현 한 코드는 항상 NULL을 반환합니다. 내 장치 위치가 켜져 있고 높은 정확도 모드로 설정되어 있는지 두 번 확인했습니다. 내 코드의 문제점을 알려주십시오.퓨즈 위치는 항상 null을 반환합니다.

내 코드 : 버튼 클릭에

import android.app.Activity; 
import android.content.Context; 
import android.content.IntentSender; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.os.Bundle; 
import android.support.v4.content.ContextCompat; 
import android.util.Log; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.PendingResult; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.common.api.Status; 
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.location.LocationSettingsRequest; 
import com.google.android.gms.location.LocationSettingsResult; 
import com.google.android.gms.location.LocationSettingsStatusCodes; 



public class FusedLocationTest implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    private static Location mLastLocation; 
    private static GoogleApiClient mGoogleApiClient; 
    private static Context context; 


    public Location getCurrentLocation(Context context) { 
     this.context = context; 
     buildGoogleApiClient(); 
     mGoogleApiClient.connect(); 
     if ((ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { 
     } 
     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     return mLastLocation; 
    } 


    /*connect to fused location provider*/ 
    synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(context) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 


    @Override 
    public void onConnected(Bundle bundle) { 

    } 


    @Override 
    public void onLocationChanged(Location location) { 

    } 


    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     buildGoogleApiClient(); 
    } 


    @Override 
    public void onConnectionSuspended(int i) { 

    } 

} 

전화는 :

@Override 
    public void onClick(View v) { 
     Location l = new FusedLocationTest().getCurrentLocation(this); 
     if(l!=null) 
      Toast.makeText(this,l.getLatitude()+", "+l.getLongitude(), Toast.LENGTH_SHORT).show(); 
     else 
      Toast.makeText(this,"NULL LOCATION", Toast.LENGTH_LONG).show(); 
    } 

답변

1

이 코드를 onConnected에 추가하면 마지막으로 알려진 위치를 얻을 수 있습니다.

private static Location mLastLocation; 
private static GoogleApiClient mGoogleApiClient; 
private static Context context; 

// added 
private LocationRequest mLocationRequest; 
private Double latitude; 
private Double longitude; 
private String TAG = ""; // set your TAG 

@Override 
public void onConnected(Bundle bundle) { 

    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 
    startLocationUpdates(); 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    if(mLastLocation == null){ 
     startLocationUpdates(); 
    } 

    if (mLastLocation != null) { 
     latitude = mLocation.getLatitude(); 
     longitude = mLocation.getLongitude(); 

     // set your tag 
     Log.d(TAG, String.valueOf(latitude)); 
     Log.d(TAG, String.valueOf(longitude)); 

    } else { 
     Toast.makeText(context, "Location not Detected, Did you turn off your location?", Toast.LENGTH_SHORT).show(); 
    } 
} 

protected void startLocationUpdates() { 
    // Create the location request 
    mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setInterval(30 * 1000) 
      .setFastestInterval(5 * 1000); 

    // Request location updates 
    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
} 

동기화 된 내용을 제거하고 그냥 공개합니다. 아래 내용을 참조하십시오.

public void buildGoogleApiClient() { } 
1

mGoogleApiClient.connect() 기능은 비동기입니다. 마지막 위치를 사용할 수있을 때까지 onConnected 때까지 기다려야합니다. documentation에 이에 대한 명확한 예가 있습니다.