Ich habe Map in Fragment implementiert. Ich möchte den aktuellen Standort, also habe ich Location Listener implementiert, der den Standort zurückgibt. Ich rufe eine API an, um alle Händler zu bekommen, damit ich die Händlerliste bekomme. Aus dieser Liste erhalte ich den Längen- und Breitengrad der Händler.Nullzeigerausnahme auf getActivity() erhalten, wenn versucht wird, durch Fragmente zu navigieren
Wenn ich die App zum ersten Mal starte und zum SearchMerchant-Fragment gehe, das sich in Home-Aktivitäten befindet, wird Map hinzugefügt. Ich kann den aktuellen Standort und den Marker sehen und wenn ich zu einem anderen Fragment zurückgehe und wieder zum SearchMerchant-Fragment komme, bekomme ich die Nullzeiger-Ausnahme, wenn ich versuche, in der onLocationChanged-Methode nach einer Netzwerkverbindung zu suchen.
Process: com.kiranacustomerapp, PID: 9934 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at com.kiranacustomerapp.helper.CommonUtils.isConnectedToInternet(CommonUtils.java:44) at com.kiranacustomerapp.Fragments.SearchMerchantFragment.onLocationChanged(SearchMerchantFragment.java:373)
at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:297)
CommonUtils Klasse:
public static boolean isConnectedToInternet(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
NetworkInfo[] info = manager.getAllNetworkInfo();
if (info != null) {
for(int i=0;i<info.length;i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
SearchMapFragment:
public class SearchMerchantFragment extends Fragment implements GetSearchedMerchantsAsyncTask.GetSearchedMerchantsCallBack,OnMapReadyCallback , GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{
// TODO: Rename parameter arguments, choose names that match
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// getLocation();
initializeLocationManager();
requestLocation();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_search_merchant, container, false);
setUpUI(view);
return view;
}
public void setUpUI(View view) {
setUpMapIfNeeded();
}
@Override
public void doPostExecute(ArrayList<Merchants> merchantsArrayList) {
merchantsList.clear();
merchantsList.addAll(merchantsArrayList);
merchantsAdapter.notifyDataSetChanged();
}
//get searched merchants
public void accessMerchants() {
if (CommonUtils.isConnectedToInternet(getContext())) {
new GetSearchedMerchantsAsyncTask(getActivity(), SearchMerchantFragment.this).execute(access_token, sessionUserId,String.valueOf(mLastLocation.getLatitude()),String.valueOf(mLastLocation.getLongitude()));
} else {
showAlert(String.valueOf(R.string.check_network));
}
}
private void setUpMapIfNeeded() {
if (mGoogleMap == null) {
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_fragment);
mapFragment.getMapAsync(this);
// getLocation();
}
}
//setup map
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
buildGoogleApiClient();
mGoogleApiClient.connect();
}
protected synchronized void buildGoogleApiClient() {
// Toast.makeText(getActivity(),"buildGoogleApiClient",Toast.LENGTH_SHORT).show();
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public void onConnected(Bundle bundle) {
// Toast.makeText(getActivity(),"onConnected",Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionSuspended(int i) {
// Toast.makeText(getActivity(),"onConnectionSuspended",Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
// Toast.makeText(getActivity(),"onConnectionFailed",Toast.LENGTH_SHORT).show();
}
private class LocationListener implements android.location.LocationListener {
private static final String TAG = "GPS";
public LocationListener(String provider) {
Log.e(TAG, "LocationListener " + provider);
mLastLocation = new Location(provider);
}
@Override
public void onLocationChanged(Location location) {
Log.e(TAG, "onLocationChanged: " + location);
mLastLocation.set(location);
try {
if (mLastLocation != null) {
//place marker at current position
// mGoogleMap.clear();
mLatLang = new LatLng(mLastLocation.getLatitude(),mLastLocation.getLongitude());
accessMerchants();
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(mLatLang);
markerOptions.title(getString(R.string.position));
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
mMarker = mGoogleMap.addMarker(markerOptions);
CameraPosition cameraPosition = new CameraPosition.Builder().target(mLatLang).zoom(14).build();
mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(5000); //5 seconds
mLocationRequest.setFastestInterval(3000); //3 seconds
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setZoomControlsEnabled(true);
mGoogleMap.getUiSettings().setAllGesturesEnabled(true);
for (Merchants merchants : merchantsList) {
LatLng latLng = new LatLng(merchants.getLatitude(), merchants.getLongitude());
MarkerOptions marker = new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)).title(merchants.getKirana_name());
Marker m = mGoogleMap.addMarker(marker);
markers.add(m);
}
}
} catch (SecurityException e) {
}
}
@Override
public void onProviderDisabled(String provider) {
Log.e(TAG, "onProviderDisabled: " + provider);
}
@Override
public void onProviderEnabled(String provider) {
Log.e(TAG, "onProviderEnabled: " + provider);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Log.e(TAG, "onStatusChanged: " + provider);
}
}
LocationListener[] mLocationListeners = new LocationListener[]{
new LocationListener(LocationManager.GPS_PROVIDER),
new LocationListener(LocationManager.NETWORK_PROVIDER)
};
private void initializeLocationManager() {
if (mLocationManager == null) {
mLocationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
}
}
public void requestLocation() {
try {
mLocationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0,0,
mLocationListeners[1]);
} catch (java.lang.SecurityException ex) {
} catch (IllegalArgumentException ex) {
}
try {
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,0,0,
mLocationListeners[0]);
} catch (java.lang.SecurityException ex) {
} catch (IllegalArgumentException ex) {
}
}
}
Ich möchte einmal den Standort erhalten und die async Aufgabe nennen Händler-Liste zu erhalten. Nachdem ich die Position erhalten habe, an der ich den Standort abbrechen möchte, beginnt ich jetzt beim Aufruf der asynchronen Task in der onLocationChange-Methode den asynchronen Task aufzurufen, sobald sich der Standort ändert. so passiert es häufig.
Was läuft hier falsch? Bitte helfen Sie, danke.
immer noch null Zeigerausnahme und auf der Karte kann ich nicht sehen, wenn die Navigation von Fragmenten. – Sid