-1

GoogleApiClientを使用してユーザーの場所を取得しています。私はユーザーの場所を取得するシングルトンクラスを作成しました。GoogleApiClient onConnected()の値を返す方法は?

public class LocationUtils { 

    private static LocationUtils locationUtils; 
    private GoogleApiClient googleApiClient; 

    public static LocationUtils getInstance() { 

     if(locationUtils == null) 
      locationUtils = new LocationUtils(); 
     return locationUtils; 
    } 

    private LocationUtils() {} 

    public Location getLocation(Context context){ 

     final Location[] location = {null}; 

     googleApiClient = new GoogleApiClient.Builder(App.getContext()) 
       .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
        @Override 
        public void onConnected(Bundle bundle) { 
         if(ContextCompat.checkSelfPermission(App.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
          location[0] = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 

         googleApiClient.disconnect(); 
        } 

        @Override 
        public void onConnectionSuspended(int i) { 

        } 
       }) 
       .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
        @Override 
        public void onConnectionFailed(ConnectionResult connectionResult) { 

        } 
       }) 
       .addApi(LocationServices.API) 
       .build(); 

     googleApiClient.connect(); 

     return location[0]; 

    } 



} 

私はLocationUtils.getInstance()のgetLocation(コンテキスト)を使用してユーザの位置を取得したい:ここでは、そのクラスです。 getLocation()メソッドを呼び出すと、GoogleApiClientに接続し、ユーザーの場所を返し、すべての呼び出しでGoogleApiClientに接続を解除する必要があります。しかし、私はそのメソッドを呼び出すとき、それはnullを返します。メインスレッドはonConnected()メソッドを待機せず、ロケーションオブジェクトをnullとして返します。どうすればonConnect()メソッドを待つことができますか?または、どうすればonConnected()のLocationオブジェクトを返すことができますか?

ます。public voidのgetLocation(コンテキストコンテキスト、最終LocationCallbackInterface:getLocationMethod()でそれを使用し、その後

public interface LocationCallbackInterface { 
    void onComplete(Location location); 
} 

解決しようはティムCastelijnsの答え

まずに従って、私はインターフェイスを作成しましたコールバック){

final Location[] location = {null}; 

googleApiClient = new GoogleApiClient.Builder(App.getContext()) 
     .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
      @Override 
      public void onConnected(Bundle bundle) { 
       if(ContextCompat.checkSelfPermission(App.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
        location[0] = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 
        //Toast.makeText(App.getContext(), "location came :" + location[0].toString(), Toast.LENGTH_LONG).show(); 
        callback.onComplete(location[0]); 
       } 

       googleApiClient.disconnect(); 
      } 

      @Override 
      public void onConnectionSuspended(int i) { 

      } 
     }) 
     .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
      @Override 
      public void onConnectionFailed(ConnectionResult connectionResult) { 

      } 
     }) 
     .addApi(LocationServices.API) 
     .build(); 

googleApiClient.connect(); 

}

、その後の活動でそのメソッドを呼び出した:

LocationUtils.getInstance().getLocation(getActivity(), new LocationCallbackInterface() { 

      @Override 
      public void onComplete(Location location) { 
       if (location != null) { 
        Toast.makeText(getActivity(), "location :" + location.toString(), Toast.LENGTH_SHORT).show(); 
        initCamera(location); 
       } else 
        Toast.makeText(getActivity(), "location is null", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

答えて

2

場所が非同期で取得されているので、あなたがそうでなければ、あなたの戻り値は常にgoogleApiClientので、nullになります、場所を返すために、コールバックを使用する必要がありますまだ行われていません。

この

public interface LocationCallback { 
    void onComplete(Location location); 
} 

変更

public Location getLocation(Context context) 

public Location getLocation(Context context, LocationCallback callback) 

ようなインターフェイスを定義し、この

LocationUtils.getLocation(context, new LocationCallback() { 
    @Override 
    onComplete(Location location) { 
     // when this is called, you will have a location. 
    } 
}); 
のようにそれを呼び出します
関連する問題