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();
}
});