I am trying to get current location with LocationClient.getLastLocation(). First, I call connect() for LocationClient in onCreate() but it gave me this error:
11-11 13:20:45.297: E/AndroidRuntime(9188): Caused by: java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called.
Then I call connect() for LocationClient inside onStart(). It gives me NullPointerException.
This code was working fine in an activity when I call connect() of LocationClient in onCreate(). However, it's not working in fragment. Where should I call connect() for LocationClient?
ClosestFragment.java:
public class ClosestFragment extends Fragment implements
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener {
private GoogleMap map;
JSONArray jsonArray;
JSONObject jsonObject, jsonObjResult;
String json = "";
ProgressDialog progress;
Location mCurrentLocation;
LocationClient mLocationClient;
SharedPreferences sp;
Double latitude = 0.0;
Double longitude = 0.0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get back arguments
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Defines the xml file for the fragment
View view = inflater.inflate(R.layout.closest_fragment, container, false);
return view;
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getActivity()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager
.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
public static ClosestFragment newInstance() {
ClosestFragment fragment = new ClosestFragment();
return fragment;
}
@Override
public void onStart() {
super.onStart();
// Connect the location client to start receiving updates
mLocationClient = new LocationClient(getActivity(), this, this);
mLocationClient.connect();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentManager fm = getChildFragmentManager();
fm.beginTransaction()
.replace(R.id.map, SupportMapFragment.newInstance()).commit();
new GetClosestKiosks().execute();
}
private class GetClosestKiosks extends AsyncTask<Void, Void, Void> {
String message="";
ArrayList<KioskInfo> kioskList = new ArrayList<KioskInfo>();
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
Location mCurrentLocation = mLocationClient.getLastLocation();
if (mCurrentLocation != null) {
latitude = mCurrentLocation.getLatitude();
Log.e("ASD", "" + latitude);
longitude = mCurrentLocation.getLongitude();
Log.e("ASD", "" + longitude);
} else {
sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
String lat = sp.getString("lat", "0");
String lon = sp.getString("lon", "0");
latitude = Double.parseDouble(lat);
longitude = Double.parseDouble(lon);
}
return null;
}
@Override
protected void onPostExecute(Void args) {
}
}
@Override
public void onConnectionFailed(ConnectionResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onConnected(Bundle arg0) {
mCurrentLocation = mLocationClient.getLastLocation();
if (mCurrentLocation != null) {
latitude = mCurrentLocation.getLatitude();
longitude = mCurrentLocation.getLongitude();
String msg = "Updated Location: "
+ Double.toString(mCurrentLocation.getLatitude()) + ","
+ Double.toString(mCurrentLocation.getLongitude());
// Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
Log.d("DEBUG", "current location: " + mCurrentLocation.toString());
} else {
String lat = sp.getString("lat", "");
String lon = sp.getString("lon", "");
latitude = Double.parseDouble(lat);
longitude = Double.parseDouble(lon);
}
}
@Override
public void onDisconnected() {
// TODO Auto-generated method stub
}
}
closest_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="20" >
<FrameLayout
android:id="@+id/map"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="10" >
</FrameLayout>
<ListView
android:id="@+id/kiosklist"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="10" >
</ListView>
</LinearLayout>
It is possible that the
doInBackground()
method ofGetClosestKiosks
is called before theLocationClient
is actually connected.So you should call your
new GetClosestKiosks().execute()
in a appropriate place. So you might call it inside thepublic void onConnected(Bundle arg0)
method.In addition, you might want to do
mLocationClient.requestLocationUpdates()
inside thedoInBackground()
method to get the more recent location.