2015-01-08 2 views
3

내 앱에서 위치 기반 기능을 구현하고 싶습니다. 나는 조금 읽고 있었고, 나는 조금 혼란스러워했다.Google Play 서비스 또는 Android 위치 서비스

거의 모든 결과가 Android Location API를 사용하는 예와 함께 제공됩니다. 안드로이드 개발자 지침을 읽고

그러나 때 다음과 같은 주 :

구글 플레이 서비스 위치 API는에 위치 인식을 추가하는 방법으로 안드로이드 프레임 워크 위치 API를 (android.location)보다 선호하는 당신 앱. 현재 Android 프레임 워크 위치 API를 사용중인 경우 최대한 빨리 Google Play 서비스 위치 API로 전환하는 것이 좋습니다.

Android Docs

그래서이 단지 위치 수신기를 구현하는 간단한 경로에 대한 이동하지 말라고 말하고있다.

제 질문은이 둘의 차이점은 무엇입니까? 내가 왜 다른 것을 사용하지 않을까요?

어디에서 Google Play 서비스 위치 API에 안전하게 안전하게 액세스하는 방법에 대한 적절한 자습서를 찾을 수 있습니까?

나는 지금까지 (안드로이드 사이트에서 제안한대로) 이것을 시도했지만 아무 콜백도 호출되지 않았습니다.

public class LocationManager implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

private Context mContext; 
private GoogleApiClient mGoogleApiClient; 
private Location mLastLocation; 

public LocationManager(Context context) { 
    mContext = context; 
    // 
    if (checkIfGooglePlayServicesAreAvailable()) { 
     //Get Access to the google service api 
     buildGoogleApiClient(); 
    } else { 
     //Use Android Location Services 
     //TODO: 
    } 
} 

public Location getCoarseLocation() { 
    if (mLastLocation != null) { 
     return mLastLocation; 
    } else return null; 
} 

private synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(mContext) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
} 

private boolean checkIfGooglePlayServicesAreAvailable() { 
    int errorCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext); 
    if (errorCode != ConnectionResult.SUCCESS) { 
     GooglePlayServicesUtil.getErrorDialog(errorCode, (MainActivity) mContext, 0).show(); 
     return false; 
    } 
    return true; 
} 


@Override 
public void onConnected(Bundle bundle) { 
    Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    if (location != null) { 
     mLastLocation = location; 
     Toast.makeText(mContext, location.getLongitude() + " , " + location.getLatitude() + " : " + location.getAccuracy(), Toast.LENGTH_LONG).show(); 
    } 
} 

@Override 
public void onConnectionSuspended(int i) { 
    Toast.makeText(mContext, "suspended", Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    Toast.makeText(mContext, connectionResult.toString(), Toast.LENGTH_LONG).show(); 
} 
} 

나는 다음 내 활동에서 내을 locationManager 전화 :

LocationManager locationManager = new LocationManager(this); 
Location location = locationManager.getCoarseLocation(); 
//Use Location 

나는 단순히 어떤 활동이나 조각에서 호출 할 수있는 도우미 클래스를 만들고 싶어. 그러나 다음을 실행하면 생성자가 성공적으로 실행됩니다. 그러나 콜백 내 중단 점 중 아무도 안타. 1 ~ 2 분 후에도 또한

mGoogleApiClient.connect() 

를 귀하의 질문에 차이점에 대해 :

+0

귀하의 코드로 판단 할 때 내가 기억하는 것처럼 Google 가이드를 따르지 않았습니다 ... 어디에서 requestLocationUpdates()를합니까? – shkschneider

+2

기본적으로 구글 위치 API는 동일하고 구글을 제외한 안드로이드 것들은 다른 위치 콜백 (GPS, 네트워크, 와이파이)을 모두 처리하므로 위치를 알아 내면 걱정할 필요가 없습니다. – tyczj

+0

@shkschneider 마지막으로 알려진 위치 : https://developer.android.com/training/location/retrieve-current.html Activity에 구현하지 않고 활동 참조를 클래스에 전달합니다. – Zapnologica

답변

2

당신은 호출 할 필요가 구글 프레임 워크는 당신에게 "융합"의 위치를 ​​제공하는 서비스를 재생할 수 있습니다. Android 프레임 워크에서는 GPS 또는 Wif를 사용해야합니다. 기준을 지정할 수 있지만 위치 사용자 위치가 필요한 경우 Google Play 서비스가 최선의 선택입니다. 예를 들어 앱이 탐색기 앱이기 때문에 GPS와 같은 매우 정확한 위치가 필요한 경우 직접 GPS를 사용하는 것보다 낫습니다.

+0

어디에서 전화하는 것이 가장 좋을까요? 위치를 원하는대로? 또는 내 LocationManager 클래스를 인스턴스화 할 때? 당신의 묘사에서 나는 도전적인 플레이 서비스를 찾고 있습니다. – Zapnologica

+1

개체를 만드는 위치를 생각합니다. – greywolf82

+0

'.connect()'에 걸리는 시간은 얼마입니까? 왜냐면 내가 전화하면. 개체를 인스턴스화 할 때 연결합니다. getCoarseLocation()을 호출 할 때 연결해야합니다. 연결될 때까지 차단할 수 있습니까? – Zapnologica

5

Google Play 서비스 Api는 연결이 설정되었을 때만 호출되는 콜백 메소드 public void onConnected(Bundle bundle)을 사용합니다. 따라서 LocationServices.FusedLocationApi.getLastLocation(googleApiClient) 메서드 호출이 올바른 Location을 반환 할 수있게됩니다.

이 위치를 얻기 위해 도우미 클래스를 만들었지 만 연결이 즉시 이루어지지 않는다는 것을 이해해야합니다. 따라서 연결이 이루어지지 않았으므로 도우미 클래스 나 메서드에 대한 비동기 호출 만 null 객체를 반환 할 수 있습니다.

다음과 같은 방법으로 Location을 얻을 수 있습니다.

1) 위치를 브로드 캐스트하고 BroadcastReceiver을 통해 수신하여 public void onConnected(Bundle bundle) 내에서 후속 작업을 수행하십시오. 이것은 나를 위해 일했다.

private boolean flag = false; 

@Override 
public void onConnected(Bundle connectionHint) { 
    location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 
    if (location != null && !flag) { 
     flag = true; 
     Intent intent = new Intent(LOCATION_BROADCAST_ACTION); 
     intent.putExtra(INTENT_EXTRA_LOCATION, location); 
     LocalBroadcastManager.getInstance(context).sendBroadcast(intent); 
     Log.i(TAG, "Sending Location Broadcast"); 
     Log.i(TAG, location.toString()); 
    } else if (location == null){ 
     Toast.makeText(mContext, R.string.no_location_detected, Toast.LENGTH_LONG).show(); 
     Log.e(TAG, "No Location Detected"); 
    } 
} 

2) 호출 활동이나 조각에서 공공 Location 객체를 생성하고 public void onConnected(Bundle bundle) 방법 내에서 그 값을 업데이트합니다.

@Override 
public void onConnected(Bundle connectionHint) { 
    location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 
    if (location != null) { 
     MyActivity.location = location; // update the Location object of you caller activity or fragment 
     Log.i(TAG, "location updated"); 
    } 
} 

또한 GoogleApiClient를 빌드 한 후 Google Play 서비스 위치 API에 연결해야합니다. 생성자에서 buildGoogleApiClient(); 메서드 호출 후 메서드 호출 mGoogleApiClient.connect()을 추가하기 만하면됩니다. Google Play 서비스를 사용할 수 있는지 확인하지 않아도됩니다.

public void onConnectionSuspended(int i) 구현에 googleApiClient.connect(); 메서드 호출을 추가 할 수도 있습니다.