我正在尝试使用Google服务API获取最后一个已知的位置,但在构建GoogleApiClient后,没有回调方法被触发.
我的活动如下所示:
public class MainActivity extends Activity implements FragmentObserver,SessionSpotListObserver,ConnectionCallbacks,OnConnectionFailedListener{ //Objects used for the location API private Location mLastLocation; private GoogleApiClient mGoogleApiClient; // Request code to use when launching the resolution activity private static final int REQUEST_RESOLVE_ERROR = 1001; // Unique tag for the error dialog fragment private static final String DIALOG_ERROR = "dialog_error"; // Bool to track whether the app is already resolving an error private boolean mResolvingError = false; public static final String STATE_RESOLVING_ERROR = "resolving_state"; //Request code to use when launching the activity to fix the connection to google API private static final int REQUEST_SOLVE_CONNEXION = 999; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //We make sure that google play service is available on the device if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS){ //We get a connection to the Google Play Service API to get the location of the user buildGoogleApiClient(); } else { GooglePlayServicesUtil.getErrorDialog(GooglePlayServicesUtil.isGooglePlayServicesAvailable(this),this,REQUEST_SOLVE_CONNEXION); } } @Override public void onConnectionFailed(ConnectionResult result) { if (mResolvingError) { // Already attempting to resolve an error. return; } else if (result.hasResolution()) { try { mResolvingError = true; result.startResolutionForResult(this,REQUEST_RESOLVE_ERROR); } catch (SendIntentException e) { // There was an error with the resolution intent. Try again. mGoogleApiClient.connect(); } } else { // Show dialog using GooglePlayServicesUtil.getErrorDialog() showErrorDialog(result.getErrorCode()); mResolvingError = true; } } // The rest of this code is all about building the error dialog /* Creates a dialog for an error message */ private void showErrorDialog(int errorCode) { // Create a fragment for the error dialog ErrorDialogFragment dialogFragment = new ErrorDialogFragment(); // Pass the error that should be displayed Bundle args = new Bundle(); args.putInt(DIALOG_ERROR,errorCode); dialogFragment.setArguments(args); dialogFragment.show(getFragmentManager(),"errordialog"); } /* Called from ErrorDialogFragment when the dialog is dismissed. */ public void onDialogDismissed() { mResolvingError = false; } /* A fragment to display an error dialog */ public static class ErrorDialogFragment extends DialogFragment { public ErrorDialogFragment() { } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Get the error code and retrieve the appropriate dialog int errorCode = this.getArguments().getInt(DIALOG_ERROR); return GooglePlayServicesUtil.getErrorDialog(errorCode,this.getActivity(),REQUEST_RESOLVE_ERROR); } @Override public void onDismiss(DialogInterface dialog) { ((MainActivity)getActivity()).onDialogDismissed(); } } @Override public void onConnected(Bundle arg0) { mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); Log.d("API Connection","The API has connected and the last location is :" + mLastLocation); if (mLastLocation != null) { } } @Override public void onConnectionSuspended(int arg0) { // TODO Auto-generated method stub } /** * Creates the connexion to the Google API. Once the API is connected,the * onConnected method is called. */ protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); }
我在所有回调方法上放置了断点,这就是我知道没有一个被调用的方法.
因为在这个阶段我没有使用Google Map Api,所以我没有注册我的应用来获取密钥.即使我得到的位置,我需要做这个吗?
不要犹豫,告诉我,如果你需要更多的信息.
谢谢你们.
解决方法
在构建您的GoogleApiClient后,您永远不会调用mGoogleApiClient.connect().你的onCreate()应该是:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); buildGoogleApiClient(); mGoogleApiClient.connect(); }
请注意,如果您使用GoogleApiClient作为connect(),则不需要调用GooglePlayServicesUtil.isGooglePlayServicesAvailable(),也包括该检查.