2013-08-18 37 views
2

首先,我整晚都在尋找答案。我已經閱讀了許多問題 - 可能都是 - 詢問爲什麼OnloCationChanged沒有被調用...沒有任何幫助。谷歌地圖v2 - Android工作室 - OnLocationChanged不被稱爲

我有一個顯示地圖的片段。我可以給它添加標記,並且它還可以正確顯示用戶的當前位置。一切似乎都沒問題,但是,我想放大用戶的位置,這就是爲什麼我需要調用「OnLocationChanged」方法的原因。

另外,locationManager.getLastKnownLocation(provider)始終返回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

由於這是迄今爲止唯一的答案,我會接受它作爲有效,儘管這些更改並未解決當時的問題。 今天,我只是再試一次,... shazam!正在工作......感謝@JRowan的嘗試。 – Skull