2013-08-18 3 views
2

Прежде всего, я искал ответ на весь этот вечер. Я прочитал многие вопросы - вероятно, все спрашивают, почему OnloCationChanged не вызывается ... мне ничего не помогло.Google Maps v2 - Android Studio - OnLocationChanged не называется

У меня есть фрагмент, который отображает карту. Я могу добавить к нему маркеры, а также правильно отобразить текущее местоположение пользователя. Кажется, все в порядке, но я хочу увеличить местоположение пользователя, и поэтому мне нужен метод «OnLocationChanged» для вызова.

Кроме того, locationManager.getLastKnownLocation (поставщик) всегда возвращает null.

Я проверил это в реальном устройстве.

Вот моя конфигурация, я надеюсь, что кто-то может указать мне в правильном направлении.

Благодаря

Фрагмент класса

public class MapMainFragment extends BaseFragment implements LocationListener{ 

private SupportMapFragment fragment; 
private GoogleMap map; 
private LocationManager locationManager; 
private static final long MIN_TIME = 500; 
private static final float MIN_DISTANCE = 0; 
String provider; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    // LOCATION 
    locationManager = (LocationManager) mActivity.getSystemService(Context.LOCATION_SERVICE); 
    boolean enabledGPS = locationManager 
      .isProviderEnabled(LocationManager.GPS_PROVIDER); 
    boolean enabledWiFi = locationManager 
      .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

    // Check if enabled and if not send user to the GSP settings 
    if (!enabledGPS && !enabledWiFi) { 
     Toast.makeText(mActivity, "GPS signal not found", Toast.LENGTH_LONG).show(); 
     Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
     startActivity(intent); 
    } 

    // Define the criteria how to select the location provider -> use 
    // default 
    Criteria criteria = new Criteria(); 
    provider = locationManager.getBestProvider(criteria, false); 
    Location location = locationManager.getLastKnownLocation(provider); 

    // Initialize the location fields 
    if (location != null) { 
     Toast.makeText(mActivity, "Selected Provider " + provider, 
       Toast.LENGTH_SHORT).show(); 
     onLocationChanged(location); 
    } 
    locationManager.requestLocationUpdates(provider, MIN_TIME, MIN_DISTANCE, this); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    return inflater.inflate(R.layout.app_tab_b_second_screen, container, false); 

} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    FragmentManager fm = getChildFragmentManager(); 
    fragment = (SupportMapFragment) fm.findFragmentById(R.id.map); 
    if (fragment == null) { 
     fragment = SupportMapFragment.newInstance(); 
     fm.beginTransaction().replace(R.id.map, fragment).commit(); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    map = fragment.getMap(); 
    // Enabling MyLocation Layer of Google Map 
    map.setMyLocationEnabled(true); 
    // Add Marker 
    final LatLng TEST_MARKER = new LatLng(50.34927, 6.26887); 
    map.addMarker(new MarkerOptions() 
      .position(TEST_MARKER) 
      .title("Title") 
      .snippet("Sheeps: 4,137,400") 
      .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))); 

} 

@Override 
public void onLocationChanged(Location location) { 
    Log.e("onLocationChanged", "called"); 
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 10); 
    map.animateCamera(cameraUpdate); 
    locationManager.removeUpdates(this); 
} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { } 

@Override 
public void onProviderEnabled(String provider) { 
    Toast.makeText(mActivity, "Enabled new provider " + provider, 
      Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    Toast.makeText(mActivity, "Disabled provider " + provider, 
      Toast.LENGTH_SHORT).show(); 
} 

BaseFragment класс

public class BaseFragment extends Fragment { 
public AppMainTabActivity mActivity; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mActivity  = (AppMainTabActivity) this.getActivity(); 
} 

public boolean onBackPressed(){ 
    return false; 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data){ 

} 
} 

Manifest.xml

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true"/> 

ответ

1

Я думаю, что в вашем OnLocation изменить это работает, но вы удалить обновления и не работает больше

закомментировать эту строку в onlocationchanged

locationManager.removeUpdates (это);

И ваш метод getbestprovider использование верно вместо ложного

+0

Спасибо @JRowan, я сделал эти изменения вы предлагаете, но это не имеет никакого значения. Сообщение журнала в начале метода onLocationChanged никогда не печатается. – Skull

+0

Поскольку это единственный ответ до сих пор, я буду считать его действительным, хотя внесение этих изменений не помогло решить проблему в то время. Сегодня я просто попробовал снова и ... шазам! работает ... Спасибо @JRowan за попытку. – Skull